2014-03-05 132 views
17

有没有办法获得一个字符串显示确切double,与所有所需的小数位,以表示其基准10的精确值?有没有一种方法可以完全格式化C#double?

例如(通过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")一个自定义格式字符串一样的东西给你足够精密,如果你分析它,你会得到你开始用相同的位模式的值 - 但在这种情况下,它只是输出0.3 。 (如果我处理的是一个计算的结果,而不是常数这将是更为有用。)
  • d.ToString("e55")输出2.9999999999999999000000000000000000000000000000000000000e-001 - 一些的精度,但不这一切像我期待的。

有一些格式字符串我错过了,或者一些其他的库函数,或者NuGet包或其他图书馆,即能够将double转换为具有全精度的字符串?

+2

你可以用约翰飞碟双向的DoubleConverter类:http://www.yoda.arachsys.com/csharp/DoubleConverter.cs 见本回答:http://stackoverflow.com/a/1658420/1445661 – mao47

+0

我不得不问的问题是:你需要什么?如果你解释你想要什么,或许我们可以给你一个更好的方法来获得它。 –

+2

需要经过第16位有效数字的数据才能精确地表示double的二进制值。该二进制值遵循语言和IEEE浮点标准规则的某种组合。看到这些数字对于理解浮点行为和舍入很重要。在Java中,我会转换为BigDecimal,它的默认toString会产生它的确切值。 –

回答

-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位;如果数字只能为以最大精度表示。

你也可以这样做:

myDouble.ToString("n16"); 

这将丢弃第16和17位的噪音,并返回以下:

3.3333333333333300 

如果你希望显示的实际变量价值作为一个数字,你可能会想要使用“G17”。如果您试图以高精度显示正在计算中使用的数值,则需要使用“n16”。

+0

这不是什么OP想要的,我一开始也是同样的心理想法,并且发表了类似于你的回答的评论,但之后删除了它。 –

-1

如果要抑制尾随零,并且避免使用科学记数法,则可以尝试使用#占位符。虽然你所需要的非常小的数字了他们很多,如:

Console.WriteLine(double.Epsilon.ToString("0.########....###")); 
+0

这不起作用,.NET框架在格式化程序应用之前预先调用。 –

相关问题