有没有办法获得一个字符串显示确切值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
转换为具有全精度的字符串?
你可以用约翰飞碟双向的DoubleConverter类:http://www.yoda.arachsys.com/csharp/DoubleConverter.cs 见本回答:http://stackoverflow.com/a/1658420/1445661 – mao47
我不得不问的问题是:你需要什么?如果你解释你想要什么,或许我们可以给你一个更好的方法来获得它。 –
需要经过第16位有效数字的数据才能精确地表示double的二进制值。该二进制值遵循语言和IEEE浮点标准规则的某种组合。看到这些数字对于理解浮点行为和舍入很重要。在Java中,我会转换为BigDecimal,它的默认toString会产生它的确切值。 –