在Python和Java上使用括号会导致十进制错误

在Python和Java上使用括号会导致十进制错误,java,math,python-2.7,rounding,parentheses,Java,Math,Python 2.7,Rounding,Parentheses,我最近调试了一个程序,该程序始终只返回小数点后几位的错误。原来错误就在我认为不需要检查的那一行:999999*(.18/12) 我知道括号是不必要的,因为从数学上讲,表达式应该计算为相同的答案,而不管它们是否存在,但我只是为了清楚起见才包含它们。然而,当我在Python解释器中输入语句时,它返回了14999.9849999999,而正确的答案应该是14999.985。当我去掉括号并键入999999*.18/12时,我得到了正确的答案(14999.985)。为了确保它不仅仅是Python的东西,我

我最近调试了一个程序,该程序始终只返回小数点后几位的错误。原来错误就在我认为不需要检查的那一行:
999999*(.18/12)

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

为什么会这样?我知道计算机无法将分数存储为精确值,因此可能会出现一定程度的错误,但计算机计算这两个语句的方式有什么不同


TL;DR:
9999999*(.18/12)
给了我一个不同于
9999999*.18/12
的答案,从数学上讲,它们的计算结果都应该是
14999.985
。为什么?

你最好先乘后除。因为与乘法过程中发生的溢出相比,除法正确表示的可能性较小。

阅读数字计算机上表示浮点数的限制。您发布的结果是由于此限制,并且在大多数情况下,这两个数字相当接近。由于此限制(无法始终保持数字的精度),不同的执行顺序可能会给出不同的结果。产生不同结果的原因是它们是两个不同的表达式-
()
是先除后乘,而不是先乘后除。所以,误差累积的方式不同。啊,这很有帮助。谢谢