在数学上,0.9重复可以显示为等于1.然而,这个问题不是关于无穷大,收敛或这背后的数学.
上述假设可以用C#中的双精度表示,具体如下.
var oneOverNine = 1d / 9d;
var resultTimesNine = oneOverNine * 9d;
Run Code Online (Sandbox Code Playgroud)
使用上面的代码,(resultTimesNine == 1d)计算结果为true.
当使用小数代替时,评估结果为false,但是,我的问题不是关于double和decimal的不同精度.
由于没有类型具有无限精度,如何以及为什么双重维持这样的相等而小数不是?关于oneOverNine变量存储在内存中的方式,上面代码的"行之间"发生了什么?
Dav*_*nan 11
它取决于用于获得最接近的可表示值到1/9的舍入.它可以采取任何一种方式.您可以在Rob Kennedy的有用页面上调查可表示性问题:http://pages.cs.wisc.edu/~rkennedy/exact-float
但是不要以为双重能够达到准确性.事实并非如此.如果您尝试使用2/9,3/9等,您会发现四舍五入的情况.底线是1/9在二进制浮点中不能完全表示.因此会发生舍入,并且您的计算会受到舍入误差的影响.