📜  Python的浮点错误

📅  最后修改于: 2021-06-28 07:21:54             🧑  作者: Mango

众所周知, 1.2 - 1.0 = 0.2 。但是,当您尝试在Python进行相同操作时,您会惊讶于结果:

>>> 1.2 - 1.0

输出:

0.199999999999999996

可以将其视为Python的错误,但事实并非如此。这与Python无关,而与底层平台如何处理浮点数有关。在系统内部内部处理浮点数时,通常会遇到这种情况。当浮点数的内部表示使用固定数量的二进制数字表示十进制数时,会导致此问题。很难用二进制表示某个十进制数,因此在许多情况下,它会导致较小的舍入误差。

我们知道十进制数学中的类似情况,有很多结果无法用固定数量的十进制数字表示,
例子

10 / 3 = 3.33333333.......

在这种情况下,以1.2为例,二进制数中的0.2表示为0.00110011001100110011001100...... ,依此类推。
在内部很难存储这个无限的十进制数。通常,浮点对象的值以固定的精度(通常为53位)存储在二进制浮点中。

所以我们内部将1.2表示为

1.0011001100110011001100110011001100110011001100110011  

完全等于:

1.1999999999999999555910790149937383830547332763671875

不过,您仍在思考为什么Python无法解决此问题,实际上它与Python无关。之所以发生这种情况,是因为这是基础c平台处理浮点数的方式,最终由于不准确,我们一直将数字记为字符串固定的数字。

请注意,这本质上是二进制浮点数:在PythonC中都不是bug,在代码中也不是bug。您会在支持我们的硬件浮点算术的所有语言中看到相同的行为,尽管某些语言默认情况下或在所有输出模式下可能不会显示差异。当我们关心需要精确精度的数学问题或在条件语句中使用它时,我们必须考虑这种行为。
检查Python文档中的浮点部分以了解更多此类行为。