【发布时间】:2013-10-17 20:02:59
【问题描述】:
在数学上,可以证明 0.9 循环等于 1。然而,这个问题与无穷大、收敛或这背后的数学无关。
上面的假设可以用 C# 中的双精度表示,如下所示。
var oneOverNine = 1d / 9d;
var resultTimesNine = oneOverNine * 9d;
使用上面的代码,(resultTimesNine == 1d) 的计算结果为 true。
当使用小数代替时,评估结果为假,但是,我的问题不是关于双精度和小数的不同精度。
既然没有类型具有无限精度,那么 double 如何以及为什么能保持这样的相等性,而小数则没有?关于oneOverNine 变量在内存中的存储方式,上面代码的“字里行间”到底发生了什么?
【问题讨论】:
-
我假设会发生舍入。对于向
1.0的双打,对于远离它的浮动。 -
什么版本的 C#、编译器和操作系统?询问是因为在 64 位 Win7 机器上使用 VS2010 为我提供了
true浮点数和双精度数,无论是 x86 还是 x64。 -
@JoelRondeau Fair 问题,在我当前的机器(VS2010,Win7 x64)上,我得到的结果与您相同,但十进制错误,所以同样,精度差异,但比较有趣。跨度>
-
从不同机器上的相同代码得到不同的答案让我想起了这个 Lippert 答案:stackoverflow.com/a/8795656/154766