Python的四舍五入问题
可能重复的问题:
Python 浮点数的四舍五入错误
我在 Python 中遇到了一个四舍五入的问题。如果我计算:
32.50 * 0.19 = 6.1749999999999998
但这个结果应该是 6.175。如果我把 6.1749999999999998 四舍五入到小数点后两位,它正确地显示为 6.18。所以这个我还能接受。
但是如果我计算这个:
32.50 * 0.19 * 3 = 18.524999999999999
这个结果应该是 18.525。如果我把 18.524999999999999 四舍五入到小数点后两位,它显示为 18.52。
它应该显示为 18.53。我哪里做错了,怎么才能解决这个问题呢?
7 个回答
3
使用Python中的Decimal模块来进行精确的浮点数运算。
from decimal import Decimal, ROUND_UP
value = Decimal(32.50 * 0.19 * 3)
print (value.quantize(Decimal('.01'), rounding=ROUND_UP))
Output: 18.53
7
简单来说,你不应该依赖浮点数的精确值,因为它们在内存中的存储方式会影响结果。
你也可以看看Python的相关文档 - 浮点数运算:问题和局限性。里面有这样一段:
举个例子,如果你想把2.675四舍五入到小数点后两位,你会得到这个结果:
>>> round(2.675, 2)
2.67
内置的round()函数说明说,它会四舍五入到最近的值,并且在遇到相等的情况时会向远离零的方向舍入。因为小数2.675正好在2.67和2.68之间,所以你可能会期待结果是(一个二进制近似值)2.68。但实际上不是,因为当小数2.675被转换成二进制浮点数时,它会被替换成一个二进制近似值,这个近似值的确切值是:
2.67499999999999982236431605997495353221893310546875
由于这个近似值离2.67更近,所以最后结果被舍入到了2.67。
6
如果你需要进行精确的数学计算,可以使用 decimal 模块:
import decimal
D=decimal.Decimal
x=D('32.50')*D('0.19')
print(x)
# 6.1750
print(x.quantize(D('0.01'),rounding=decimal.ROUND_UP))
# 6.18
y=D('32.50')*D('0.19')*D('3')
print(y)
# 18.5250
print(y.quantize(D('0.01'),rounding=decimal.ROUND_UP))
# 18.53