有没有办法格式化C#double?

时间:2014-03-05 14:15:18

标签: c# floating-point floating-point-precision

有没有办法让字符串显示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转换为具有完全精度的字符串?

2 个答案:

答案 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”。