可能重复:
带有浮点数的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.我做错了什么,我该如何解决?
简而言之 - 您不应该依赖浮点数的精确值,因为它们存储在内存中的方式.
另请参阅有关它的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,因此它向下舍入.
如果你需要精确的算术,你可以使用小数模块:
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)
归档时间: |
|
查看次数: |
6836 次 |
最近记录: |