2015-10-05 50 views

回答

1

这是因为double精度有限,而decimal存储十进制数字。在这里阅读更多:Difference between decimal, float and double in .NET?

基本上decimal是在存储数量十进制表示更好。

编辑:在回答你原来的问题更加明确:无论你的结果是有点不正确因为-36.845167不能表示为double。看看这个表达式的输出:

result.ToString("G20") 

双方你的结果,你会看到他们两人不等于-36.845167:其中之一是-36.845166999999996等是- 36.845167000000004

因此,他们都是4e-15关闭您的原始号码。在调试器中(或输出到控制台)真正看到的只是在转换为字符串期间的四舍五入。

+0

但是,为什么可以通过使用double的TryParse方法直接创建double而不是直接创建正确的double? – zcj

+0

我会更新答案 – torvin

2

两个双打包围-36.845167是-36.84516700000000355430529452860355377197265625和-36.84516699999999644887793692760169506072998046875

它们从精确值通过3.55112206307239830493927001953125E-15和 分别3.55430529452860355377197265625E-15不同。

第一个比较接近,所以它是正确的IEEE 754最接近的结果。我不知道该标准要求将C#十进制转换为double的标准,但是,假定在这两种情况下使用了相同的输出方法,它可能没有做到圆整到最近。

相关问题