浮点数是近似值,它们不能精确地存储十进制数.因为它们试图仅以64位表示非常大的数字范围,所以它们必须在某种程度上接近.
了解这一点非常重要,因为它会导致一些奇怪的副作用.例如,您可能会非常合理地认为十批0.1的总和为1.0.虽然这似乎是合乎逻辑的,但在浮点时它也是错误的:
>>> f = 0.0
>>> for _ in range (10):
... f += 0.1
...
>>> print f == 1.0
False
>>> f
0.99999999999999989
>>> str(f)
1.0
您可能认为n / m * m == n.浮点世界再一次不同意:
>>> (1.0 / 103.0) * 103.0
0.99999999999999989
或者也许同样奇怪的是,人们可能会认为对于所有n,n 1!= n.在浮点土地上,数字不能像这样工作:
>>> 10.0**200
9.9999999999999997e+199
>>> 10.0**200 == 10.0**200 + 1
True
# How much do we have to add to 10.0**200 before its
# floating point representation changes?
>>> 10.0**200 == 10.0**200 + 10.0**183
True
>>> 10.0**200 == 10.0**200 + 10.0**184
False
如果您需要精确的十进制表示,请查看decimal模块,这是自2.4以来python标准库的一部分.它允许您指定有效数字的数量.缺点是,它比浮点慢得多,因为浮点运算是在硬件中实现的,而十进制运算完全是在软件中实现的.它也有自己的不精确问题,但如果你需要十进制数的精确表示(例如,对于金融应用程序),它是理想的.
例如:
>>> 3.14
3.1400000000000001
>>> import decimal
>>> decimal.Decimal('3.14')
>>> print decimal.Decimal('3.14')
3.14
# change the precision:
>>> decimal.getcontext().prec = 6
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.142857')
>>> decimal.getcontext().prec = 28
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')