python的round()采用“四舍六入五成双”规则而非四舍五入,旨在减少统计偏差;需精确舍入时应使用decimal模块的round_half_up,避免浮点精度误差。

Python 的 round() 为什么有时“四舍”不入、“五入”也不进
因为 round() 遵循的是“四舍六入五成双”(银行家舍入),不是数学课教的四舍五入。它优先让结果朝偶数靠拢,目的是减少统计偏差。
常见错误现象:round(2.5) 得 2,round(3.5) 得 4,round(1.25, 1) 得 1.2(不是 1.3)——这和直觉冲突,尤其做财务或教学场景时容易翻车。
- 只在浮点数精度足够、且小数位恰好是 .5 时才明显暴露问题
- Python 3+ 全面采用该规则;Python 2 的
round()行为不一致,已淘汰 - 这不是 bug,是 IEEE 754 和语言设计共同决定的默认行为
想严格四舍五入,该用哪个函数
别硬改 round(),直接换方案。最稳妥的是用 decimal 模块,它能完全控制舍入逻辑。
使用场景:金额计算、考试分数、任何不能接受统计偏移的业务。
立即学习“Python免费学习笔记(深入)”;
from decimal import Decimal, ROUND_HALF_UP-
Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_UP)→Decimal('3') - 注意传字符串初始化
Decimal,避免浮点字面量自带精度误差(比如Decimal(2.5)实际是Decimal('2.4999999999999998')) - 性能比内置
round()差不少,高频数值计算慎用
用 numpy.round() 会不一样吗
会,但只是表面不同——它默认也走银行家舍入,和 Python 内置 round() 一致。真正区别在于处理数组和 NaN 的方式。
使用场景:批量处理 NumPy 数组,或需要与 np.nan 共存的数值流。
-
np.round([2.5, 3.5])→array([2., 4.]),和round()结果相同 - 遇到
np.nan时,np.round(np.nan)返回nan;而round(float('nan'))报ValueError - 参数名是
decimals而非ndigits,别写错 - 底层仍受浮点表示限制,不能解决根本精度问题
为什么 float 本身就不适合精确舍入
因为大多数十进制小数(如 0.1、0.2、0.25)在二进制浮点中无法精确表示,round(0.25 + 0.25, 1) 看似该得 0.5,实际可能是 0.49999999999999994,导致舍入结果意外。
- 这是 IEEE 754 标准的固有限制,所有语言都一样,不单是 Python 的问题
- 打印时看到的
0.1是 Python 做了“友好显示”,真实值永远有微小误差 - 只要涉及精确小数运算(尤其是货币),必须用
Decimal或整数单位(例如全部转成分来算) - 调试时用
repr(x)替代str(x)查看真实值
round();不能,立刻切到 Decimal。










