首页 > 解决方案 > 带 2 位小数的舍入方法的错误结果

问题描述

我对带有 2 个小数位的 round() 的结果感到困惑

a = 1352.845
res = round(a, 2)
=> 1352.85 (Right as I expected)

b = 578.005
res = round(b, 2)
=> 578.0 (Wrong, It would be 578.01 instead of 578.0)

案例 b 会发生什么或我误解了什么?

答案

from decimal import Decimal, ROUND_UP

Decimal('578.005').quantize(Decimal('.01'), rounding=ROUND_UP)

因为它需要用于货币,所以 python round() (银行家的舍入)的默认约定在我的情况下不正确

标签: pythonrounding

解决方案


其实并没有错。
这是银行家的四舍五入,是故意的实现细节。

如果您希望保留“始终向上取整 0.5”的方法,您可以这样做:

import decimal
#The rounding you are looking for
decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
>>> Decimal('4')
decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_UP)
>>> Decimal('3')


#Other kinds of rounding
decimal.Decimal('2.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_EVEN)
>>> Decimal('2')

decimal.Decimal('3.5').quantize(decimal.Decimal('1'), rounding=decimal.ROUND_HALF_DOWN)
>>> Decimal('3')

推荐阅读