数学上,0.9重复可以显示为等于1.然而,这个问题不是关于无穷大,收敛或背后的数学。
上述假设可以用C#中的双精度表示,如下所示。
var oneOverNine = 1d / 9d;
var resultTimesNine = oneOverNine * 9d;
使用上面的代码,(resultTimesNine == 1d)
的计算结果为真。
当使用小数时,评估结果为false,但是,我的问题不是关于double和decimal的不同精度。
因为没有类型具有无限精度,所以如何以及为什么双重维持这样的相等而小数不是?关于oneOverNine
变量存储在内存中的方式,上面代码的“行之间”发生了什么?
答案 0 :(得分:11)
它取决于用于获得最接近的可表示值的舍入为1/9。它可以采取任何一种方式。您可以在Rob Kennedy的有用页面上调查可表示性问题:http://pages.cs.wisc.edu/~rkennedy/exact-float
但是不要认为双重能够达到正确性。事实并非如此。如果您尝试使用2 / 9,3 / 9等,您会发现四舍五入的情况。底线是1/9在二进制浮点中不能完全表示。因此,舍入发生并且您的计算受到舍入误差的影响。
答案 1 :(得分:2)
关于oneOverNine变量存储在内存中的方式,上面代码的“行间”究竟发生了什么?
您所询问的内容称为IEEE 754。这是C#,它的底层.Net运行时以及大多数其他编程平台用于存储和操作十进制值的规范。这是因为对IEEE 754的支持通常直接在CPU /芯片组级实现,这使得它比仅在软件中实现的替代方案更具性能,并且在构建编译器时更容易,因为操作几乎直接映射到特定的CPU指令