Python的舍入问题

fas*_*ias 2 python rounding

可能重复:
带有浮点数的Python舍入错误

我在Python中有一个舍入问题.如果我计算

32.50*0.19 = 6.1749999999999998

但这应该是6.175.如果我将6.1749999999999998舍入为2位小数,则正确显示6.18.所以我可以忍受.

但如果我算这个:

32.50*0.19*3 = 18.524999999999999

这应该是18.525.如果我将值18.524999999999999四舍五入,则显示18.52.

它应该显示我18.53.我做错了什么,我该如何解决?

Rom*_*huk 7

每个计算机科学家应该知道的浮点运算.

简而言之 - 您不应该依赖浮点数的精确值,因为它们存储在内存中的方式.

另请参阅有关它的python docs - 浮点算术:问题和限制.它包含下一段:

例如,如果您尝试将值2.675舍入到两位小数,则可以得到此值

>>> round(2.675, 2)
2.67

内置round()函数的文档表示它会舍入到最接近的值,从而将关系从零开始舍入.由于小数部分2.675恰好位于2.67和2.68之间,因此您可能期望此结果为(二进制近似值)2.68.它不是,因为当十进制字符串2.675被转换为二进制浮点数时,它再次被二进制近似替换,其精确值是

2.67499999999999982236431605997495353221893310546875

由于这个近似值略微接近2.67而不是2.68,因此它向下舍入.


unu*_*tbu 5

如果你需要精确的算术,你可以使用小数模块:

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
Run Code Online (Sandbox Code Playgroud)