float
在 Python 中使用值时,不可能实现完全准确的数字比较。这是因为浮点值在精度上固有地受到限制。
在您的示例中,该数字将具有与(如 nneonneo 在评论中提到的)1.5999999999999999999999
相同的浮点表示。1.6
可能更令您惊讶的是,浮点表示并不完全等于任何一个源数字(到小数点后 20 位,它是1.60000000000000008882
)。Python 对您隐藏了一点,因为如果您将数字打印出来,1.6
即使它稍微大一点,它也会显示出来。
最后的额外位是舍入误差,因为没有任何 1.6 的非重复二进制表示。就像三分之一只能用无限重复的十进制精确表示一样,1.6
需要无限位数才能用二进制精确表示。该错误来自于在一定数量的数字后停止表示并将其余部分四舍五入(如表示1/3
为0.333333
,并将重复的 3 的其余部分四舍五入)。
有很多方法可以编写代码来减轻浮点错误的影响,但你不能让它们完全消失,除非,我想,在需要极高精度的情况下不使用浮点值. 在 Python 中,如果您想要更高的精度(以牺牲一些性能为代价),您可以改用标准库中的 Decimal 类:
from decimal import Decimal
d1 = Decimal("1.5999999999999999999999")
d2 = Decimal("1.6")
print(d1 >= d2) # prints: False