Python中的舍入逻辑?

时间:2014-05-31 13:38:26

标签: python rounding

在我的原始代码中,我试图从一些浮点值中计算一些索引,我遇到了以下问题:

>>> print int((1.40-.3)/.05)
21

可是:

>>> print ((1.40-.3)/.05)
22.0

我对发生的事情一无所知。有人可以解释一下吗?

3 个答案:

答案 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')