四舍五入到小数点后两位的结果错误

时间:2018-12-17 05:01:25

标签: python rounding

我对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()(Banker's Rounding)的默认约定在我的情况下不合适

3 个答案:

答案 0 :(得分:2)

虽然可能会造成混淆,但这是由于大多数十进制小数不能精确表示为float类型。

有关更多参考,请参见:https://docs.python.org/3/tutorial/floatingpoint.html#tut-fp-issues

答案 1 :(得分:2)

实际上没错。
它是Banker's Rounding,是有目的的实现细节。

如果您希望保留“始终向上取整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')

答案 2 :(得分:0)

回想一下您的物理/数学课,他们在那里教过四舍五入的工作原理。

如果最后一位数字为“ 5”并且四舍五入,则前一位数字应为奇数,然后移至下一位偶数,如果已经为偶数,则应保持不变。