2.0 == 2.000 当然,显而易见,应该是相等的,
>>> 2.0 == 2.000
True
True
>>> 2.0 == 2
True
但是,如果有很小的浮点尾数呢?
>>> 2.0 == 2.000000000000000000000000001 True 。。。 >>> 2.0 == 2.0000000000000000001 True >>> 2.0 == 2.0000000000000001 True >>> 2.0 == 2.000000000000001 False >>> 2.0 == 2.00000000000001 True >>> 2.0 == 2.000000001 False
>>> 0.1+0.2
0.30000000000000004
>>> 0.1+0.2 == 0.30000000000000004
True
>>> 0.1+0.2 == 0.3000000000000004
False
>>> 0.1+0.2 == 0.30000000000000004
True
>>> 0.1+0.2 == 0.300000000000000041
True
>>> 0.1+0.2 == 0.300000000000000041212
True
>>> 0.1+0.2 == 0.300000000000000044444
True
>>> 0.1+0.2 - 0.300000000000000044444
0.0
>>> 0.1+0.2 - 0.30000000000000004999
0.0
>>>
神奇吧, 为什么呢? 其实就是 浮点数的神奇之处了。
在 Python 中,比较 2.0 == 2.0000000000000000001
返回 True
是由于浮点数的表示方式和精度限制。浮点数在计算机中使用二进制浮点数格式来近似表示,这种格式基于 IEEE 754 标准。
浮点数的表示涉及到一个尾数(mantissa)和一个指数(exponent)。由于二进制和十进制的转换,某些十进制小数无法精确地用二进制表示。例如,十进制的 0.1
在二进制中是一个无限循环小数,无法用有限的位数精确表示。
当你看到 2.0 == 2.0000000000000000001
时,实际上是因为 2.0000000000000000001
是 2.0
在二进制浮点数表示中的一个近似值。由于精度限制,2.0
在内存中的二进制表示可能与 2.0000000000000000001
相同,因此 Python 认为它们是相等的。
这种现象在很多编程语言中都存在,不仅限于 Python。它揭示了浮点数计算的一个常见陷阱:浮点数的不精确性。
要处理浮点数的比较,可以采取以下方法:
-
使用一个小的阈值:当比较两个浮点数是否相等时,检查它们之间的绝对差值是否小于某个小的阈值(如
1e-9
)。 -
避免直接比较:如果可能,避免直接比较两个浮点数是否相等,而是使用比较操作符来检查它们是否足够接近。
-
使用整数:如果问题允许,使用整数而不是浮点数来避免精度问题。
-
使用
decimal
模块:Python 的decimal
模块提供了更高精度的十进制数运算。 -
理解并利用 IEEE 754:了解 IEEE 754 标准的工作原理,以及如何在特定情况下处理浮点数。
记住,当你在 Python 中看到类似的比较结果时,并不是说两个数真的相等,而是它们在计算机的浮点数表示中足够接近,以至于 Python 认为它们相等。