Python3中round函数对部分值取整异常:4800.5返回4800而非4801
Python 3中
round(4800.5)返回4800的原因 这个结果是Python 3的round函数默认舍入规则导致的,不是程序bug。
Python 3的round采用的是银行家舍入法(四舍六入五成双),不是大家日常认知里的“四舍五入”,具体规则如下:
- 待舍弃的部分数值小于5时,直接舍去保留位后的内容
- 待舍弃的部分数值大于5时,保留位向前加1
- 待舍弃的部分数值恰好等于5时,看保留位最后一位的奇偶性:如果是偶数就直接舍去,如果是奇数就向前加1,最终让保留位的最后一位为偶数
你遇到的round(4800.5)刚好命中第三种情况:舍弃部分是0.5,整数部分最后一位是0(偶数),所以直接舍去0.5返回4800。可以用几个测试用例验证这个规则:
print(round(4800.5)) # 输出4800,末位0为偶数,舍去 print(round(4801.5)) # 输出4802,末位1为奇数,进1后末位为2(偶数) print(round(2.5)) # 输出2 print(round(3.5)) # 输出4
如果需要实现传统认知里的四舍五入效果,可以借助
decimal模块手动指定舍入模式为ROUND_HALF_UP:
from decimal import Decimal, ROUND_HALF_UP def half_up_round(num): return int(Decimal(str(num)).quantize(Decimal('0'), rounding=ROUND_HALF_UP)) print(half_up_round(4800.5)) # 输出4801,符合常规四舍五入预期
补充说明:这个场景下不存在浮点数精度误差问题,0.5是2的-1次幂,可以被二进制浮点数精确表示,结果完全是舍入规则导致的。
内容的提问来源于stack exchange,提问作者Paramjeet
相关产品推荐
相关产品推荐

