如何将双精度小数位数转换为字符串



我有4个例子:

double a = 1.05;
double b = 0.000056;
double c = 0.7812;
double d = 1.2;

我想做的是首先找到有多少地方价值观。在这种情况下,

int inta = 2;
int intb = 6;
int intc = 4;
int intd = 1;

然后我想创建一个字符串,其中"0"表示这些数字。这是ToString((

string stra = ".00";
string strb = ".000000";
string strc = ".0000";
string strd = ".0";

所以我只有一个替身。我需要位置值,然后如何创建字符串。

您可以将double转换为字符串,然后获得子字符串:

double a = 1.05;
// Convert to string
string aString = a.ToString();
// Get substring
string result = aString.Substring(aString.LastIndexOf('.'));
// Get number of decimals
int numDecimals = result.Length - 1;
// Create string based on decimal count
string zeroString = ".";
for (int i = 0; i < numDecimals; i++) {
zeroString += "0";
}
Console.WriteLine(result);
Console.WriteLine(numDecimals);
Console.WriteLine(zeroString);
// .05
// 2
// .00

**确保这适用于所有文化,而不仅仅是那些使用"。"作为十进制分隔符,您可以替换:

LastIndexOf('.')

带有

LastIndexOf(System.Threading.Thread.CurrentThread.CurrentCulture.NumberFormat.CurrencyDecimalSeparator)

(谢谢@John(

Double不能准确地表示所有以10为基数的分数。相反,您应该使用十进制类型。

decimal a = 1.05;
decimal b = 0.000056;
decimal c = 0.7812;
decimal d = 1.2;
decimal e = 1.456000;
a.ToString() == "1.05"
b.ToString() == "0.000056"
c.ToString() == "0.7812"
d.ToString() == "1.2"
e.ToString() == "1.456000"
public static decimal Normalise(this decimal value) => value / 1.000000000000000000000000000000000m;
e.Normalise().ToString() == "1.456"

我认为这个问题不合理。具体来说,这部分:

首先查找有多少[十进制]位值

小数位数是一个表示问题,而不是数字的固有属性。当写入double a = 0.3;时,存储到变量a中的是最接近精确小数0.3的双精度值。该值接近0.3,但并不等于0.3,因为IEEE-754是基于二进制的,而0.3是非终止二进制分数。但是,一旦赋值,变量a就不记得它来自哪里,也不记得源代码是否将它作为double a = 0.3;double a = 0.29999999999999999;

考虑以下片段:

double a = 0.3;
double b = 0.2999999999999999;
double c = 0.29999999999999999;
Console.WriteLine("a = {0}, b = {1}, c = {2}, a==b = {3}, b==c = {4}, a==c = {5}", a, b, c, a==b, b==c, a==c);

输出为:

a = 0.3, b = 0.3, c = 0.3, a==b = False, b==c = False, a==c = True

这表明,变量ac比较相等,即它们具有完全相同的值,但其中一个定义为1位小数,而另一个则定义为17位小数。要点是,谈论与浮点相关的小数位数是没有意义的,因为正如本例所示,同一个值可以有不同的小数位数表示。。

作为旁注,上面还显示了bc是不同的值,尽管它们仅在小数点后17位不同。这与double类型的有效小数位数在15到17之间是一致的,这就是为什么通常不能忽略第16和第17位。

最新更新