我使用的是python 2.7,我的代码是:
a = 10.5 * 22.34 / 2.0
print "%.2f" % a
我期望的结果是117.29,但它显示117.28。如何解决问题?
答案 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)