在我的原始代码中,我试图从一些浮点值中计算一些索引,我遇到了以下问题:
>>> print int((1.40-.3)/.05)
21
可是:
>>> print ((1.40-.3)/.05)
22.0
我对发生的事情一无所知。有人可以解释一下吗?
答案 0 :(得分:2)
这是由浮点不准确引起的:
>>> print repr((1.40-.3)/.05)
21.999999999999996
您可以尝试使用Decimal
类型:
>>> from decimal import Decimal
>>> Decimal
<class 'decimal.Decimal'>
然后
>>> (Decimal('1.40') - Decimal('.3')) / Decimal('.05')
Decimal('22')
fractions.Fraction
课程也可以。或者,你可以圆了:
>>> round((1.40-.3)/.05, 10) # round to 10 decimal places
22.0
答案 1 :(得分:1)
删除print
,您将看到实际值为:
>>> (1.40-.3)/.05
21.999999999999996
Python 2 print()
(更确切地说,float.__str__
)通过舍入到几个十进制数字而对你而言。 Python 3 print()
(再次,实际上float.__str__
)没有这样做,它总是忠实地表示实际值(它缩写,但只有当它没有改变时值)。
这种不准确性是浮点数(包括Decimal
所固有的,尽管它的不准确性会发生在不同的情况下)。这是一个基本问题,代表任意实数是不可能的。有关说明,请参阅Is floating point math broken?。
答案 2 :(得分:0)
我认为这直接解释了:
import decimal
>>> (decimal.Decimal(1.40) -decimal.Decimal(.3))/decimal.Decimal(.05)
Decimal('21.99999999999999722444243843')
>>> (decimal.Decimal('1.40') -decimal.Decimal('.3'))/decimal.Decimal('.05')
Decimal('22')