使用括号会导致 Python 和 Java 上的小数错误



我最近在调试一个程序,该程序始终返回错误,只差几个小数点。事实证明,错误就在我认为我不需要检查的行上:999999 * (.18 / 12).

我知道括号不是必需的,因为从数学上讲,无论它们是否存在,表达式都应该计算出相同的答案,但我将它们包括在内只是为了清楚起见。但是,当我在 Python 解释器中键入语句时,它返回了 14999.98499999999 ,而正确答案应该是 14999.985 。当我去掉括号并输入999999 * .18 / 12时,我得到了正确的答案(14999.985)。为了确保它不仅仅是Python的东西,我也用Java尝试过,同样的答案。

这是为什么呢?我知道计算机不能将分数存储为精确值,因此可以预期一定程度的错误,但是计算机计算这两个语句的方式有什么区别?

TL;DR:999999 * (.18 / 12)给了我一个与999999 * .18 / 12不同的答案,在数学上,它们都应该评估为14999.985。为什么?

你最好在除法之前做一个乘法。因为与乘法期间发生的溢出相比,除法正确表示的可能性较小。

最新更新