【发布时间】:2010-11-28 02:10:43
【问题描述】:
如果我在 C# 中执行以下表达式:
double i = 10*0.69;
i 是:6.8999999999999995。为什么?
我知道像 1/3 这样的数字很难用二进制表示,因为它有无限的循环小数位,但 0.69 不是这种情况。而0.69可以很容易地用二进制表示,一个二进制数表示69,另一个表示小数位的位置。
我该如何解决这个问题?使用decimal 类型?
【问题讨论】:
-
请考虑一下:在已经存在多年的框架中偶然发现这样的错误的可能性有多大?
-
在几乎任何其他正确实现浮点运算的语言/框架中,您都会得到类似的结果。
-
嘿嘿。这是不变的真理;每当您阅读带有“...用 abc 语言破坏的乘法...”的主题时,它将是关于浮点的 :)
-
Brian:我认为这不是一个好方法。我认为您可以合理地假设可能存在问题,但我也认为自己研究它是合理的。回到那天,我记得发现了 Java 错误;这并不意味着我很特别,这只是一个意外。研究是需要教授的。
-
我喜欢如何将其存储在 BINARY 中的解释依赖于指定 DECIMAL 位置的位置