我对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)的默认约定在我的情况下不合适
答案 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”并且四舍五入,则前一位数字应为奇数,然后移至下一位偶数,如果已经为偶数,则应保持不变。