有没有办法让字符串显示double
的完全值, all 表示其在基数中的精确值所需的小数位数10?
例如(通过Jon Skeet and Tony the Pony),当您键入
时double d = 0.3;
d
的实际值恰好是
0.299999999999999988897769753748434595763683319091796875
每个二进制浮点值(忽略无穷大和NaN之类的东西)将解析为终止十进制值。因此,在输出中有足够的精度数字(在这种情况下为55),您可以随时获取double
中的任何内容并以十进制显示其精确值。当需要解释浮点运算的奇怪性时,能够向人们展示确切的值是非常有用的。但有没有办法在C#中做到这一点?
我已经尝试了所有standard numeric format strings,无论是否指定了精度,并且没有给出确切的值。一些亮点:
d.ToString("n55")
输出0.3
后跟54个零 - 它通常会“轮到您可能想要看到的内容”,然后在最后添加更多的零。如果我使用自定义格式字符串0.00000...
d.ToString("r")
为您提供足够精度的值,如果您解析它,您将获得与您开始时相同的位模式 - 但在这种情况下,它只输出{{1 }}。 (如果我处理的是计算结果而不是常数,那么这将更有用。)0.3
输出d.ToString("e55")
- 一些精确度,但不是所有,就像我正在寻找的那样。是否有一些我错过的格式字符串,或其他一些库函数,或NuGet包或其他库,能够将2.9999999999999999000000000000000000000000000000000000000e-001
转换为具有完全精度的字符串?
答案 0 :(得分:-1)
如果要抑制尾随零,可以尝试使用#占位符,并避免使用科学记数法。虽然你需要很多非常小的数字,例如:
Console.WriteLine(double.Epsilon.ToString("0.########....###"));
答案 1 :(得分:-3)
我相信你可以根据你想用显示器完成的任务来做到这一点:
考虑一下:
Double myDouble = 10/3;
myDouble.ToString("G17");
您的输出将是:
3.3333333333333335
请参阅此链接了解原因:http://msdn.microsoft.com/en-us/library/kfsatb94(v=vs.110).aspx
默认情况下,返回值仅包含15位精度,但内部最多保留17位数。如果此实例的值大于15位,ToString将返回PositiveInfinitySymbol或NegativeInfinitySymbol而不是预期的数字。如果您需要更高的精度,请指定格式为“G17”格式规范,它始终返回17位精度,或“R”,如果数字可以用该精度表示,则返回15位数,如果数字只能表示,则返回17位数以最大精度表示。
你也可以这样做:
myDouble.ToString("n16");
这将丢弃第16和第17个噪音数字,并返回以下内容:
3.3333333333333300
如果您希望将实际变量值显示为数字,则可能需要使用“G17”。如果您试图以高精度显示计算中使用的数值,则需要使用“n16”。