浮点数的一个普遍问题是它们并不能精确的表示十进制数,即使是最简单的数学运算也会产生小的误差,比如:
>>> 1 + 1.11
2.1100000000000003
>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征(参考官方文档)15. 浮点算术:争议和限制 。 由于Python的浮点数据类型使用底层表示存储数据,因此没办法避免这样的误差。如果想更加精确(并能容忍一定的性能损耗),可以用 decimal
模块:
>>> from decimal import Decimal
>>> a = Decimal('1')
>>> b = Decimal('1.11')
>>> a + b
Decimal('2.11')