Python浮动回合错误117.285回合到117.28而不是117.29

时间:2012-02-15 21:28:21

标签: python

我使用的是python 2.7,我的代码是:

a = 10.5 * 22.34 / 2.0
print "%.2f" % a

我期望的结果是117.29,但它显示117.28。如何解决问题?

3 个答案:

答案 0 :(得分:10)

如果Python使用的是64位IEEE-754二进制浮点类型,那么它使用的完全值将是

117.284999999999996589394868351519107818603515625

......这显然低于117.28和117.29之间的中点。这可能是正在发生的事情。

另一个选择是Python正在使用Banker's Rounding

如果确切的小数值对您很重要,您可能需要考虑使用decimal

答案 1 :(得分:7)

先生。 Skeet有the correct answer,下面是如何使用他引用的decimal模块的示例:

import decimal
a = decimal.Decimal('117.285')
rounded = a.quantize(decimal.Decimal('.01'), rounding=decimal.ROUND_HALF_UP)
print rounded
# 117.29
repr(rounded)
# "Decimal('117.29')"

答案 2 :(得分:1)

如果你想要一个简单的解决方案并且不关心性能,你可以使用这样的函数转换为整数,舍入,并转换回浮点数:

def round_exact(number, decimal_places=0):
    """Round the number to the given number of decimal places by converting to 
    and from integers to avoid floating point error."""
    factor = 10**(decimal_places + 1)
    rounded_int = int(number * factor)
    if rounded_int % 10 >= 5:
        # Round up
        return (int(rounded_int//10) + 1) / float(factor//10)
    # Round down
    return int(rounded_int//10) / float(factor//10)