Python 中的 round() 函数不是严格的“四舍五入“,而是采用银行家舍入法(Bankers‘ Rounding)
round()是 Python 的内置函数用于对数字进行四舍五入。Python的round()函数采用银行家舍入法奇进偶不进而非传统四舍五入。如round(2.5)返回2而非3这是为了减少统计偏差。对于需要传统四舍五入的场景建议使用Decimal模块的ROUND_HALF_UP模式或自定义函数处理。注意浮点数精度问题如2.675可能存储为2.674999...金融计算推荐使用Decimal保证精度数据显示可用格式化方法。银行家舍入法适合科学计算而商业场景通常需要传统四舍五入规则。round()函数详解round()是 Python 的内置函数用于对数字进行四舍五入。基本语法round(number, ndigitsNone)number要四舍五入的数字ndigits保留的小数位数可选默认为 0返回值四舍五入后的数字基本用法python# 不指定小数位数四舍五入到整数 print(round(3.14)) # 3 print(round(3.5)) # 4 print(round(3.6)) # 4 print(round(-3.5)) # -4注意负数 # 指定小数位数 print(round(3.14159, 2)) # 3.14 print(round(3.14159, 3)) # 3.142 print(round(3.14159, 0)) # 3.0返回浮点数特殊情况银行家舍入法Python 的round()采用银行家舍入法偶数舍入当数字正好在中间时会舍入到最近的偶数python# 四舍五入到整数 print(round(2.5)) # 2舍入到偶数 2 print(round(3.5)) # 4舍入到偶数 4 print(round(4.5)) # 4舍入到偶数 4 print(round(5.5)) # 6舍入到偶数 6 # 保留一位小数 print(round(2.25, 1)) # 2.22.2 和 2.3 中间舍入到偶数 2.2 print(round(2.35, 1)) # 2.42.3 和 2.4 中间舍入到偶数 2.4 print(round(2.45, 1)) # 2.5注意浮点数精度问题实际应用场景1.金额计算保留两位小数pythonprice 19.99 quantity 3 total price * quantity result round(total, 2) print(result) # 59.972.百分比计算pythonscore 85 total_score 120 percentage (score / total_score) * 100 rounded round(percentage, 1) print(f得分率{rounded}%) # 得分率70.8%3.格式化输出pythonimport math pi math.pi print(round(pi, 2)) # 3.14 print(round(pi, 4)) # 3.1416注意事项1.浮点数精度问题python# 浮点数存储可能不精确 print(round(2.675, 2)) # 2.67不是预期的 2.68 # 原因2.675 实际存储为 2.67499999999999982.ndigits 为负数python# 负数表示舍入到十位、百位等 print(round(123.45, -1)) # 120.0舍入到十位 print(round(123.45, -2)) # 100.0舍入到百位 print(round(9876, -3)) # 10000舍入到千位3.返回值类型python# ndigits 省略或为 None返回 int print(type(round(3.14))) # class int print(type(round(3.14, 0))) # class float # ndigits 指定返回 float print(type(round(3.14, 1))) # class float对比其他方法python# 1. round() - 四舍五入 print(round(3.14159, 2)) # 3.14 # 2. format() - 格式化字符串 print(f{3.14159:.2f}) # 3.14 print({:.2f}.format(3.14159)) # 3.14 # 3. Decimal - 精确十进制运算 from decimal import Decimal, ROUND_HALF_UP num Decimal(2.675) print(num.quantize(Decimal(0.01), roundingROUND_HALF_UP)) # 2.68替代方案真正的四舍五入如果需要传统意义的四舍五入远离零舍入可以使用decimal模块pythonfrom decimal import Decimal, ROUND_HALF_UP def traditional_round(num, digits0): 传统四舍五入 num_str str(num) decimal Decimal(num_str) return float(decimal.quantize(Decimal(0. 0 * digits), roundingROUND_HALF_UP)) # 测试 print(traditional_round(2.675, 2)) # 2.68传统四舍五入 print(round(2.675, 2)) # 2.67银行家舍入总结round()用于四舍五入但采用银行家舍入法默认返回整数指定ndigits返回浮点数注意浮点数精度问题金融计算建议使用Decimal模块Python 中的round()函数不是严格的四舍五入而是采用银行家舍入法Bankers Rounding。核心规则奇进偶不进奇进偶不进是银行家舍入法的通俗口诀专门用来处理刚好是中间值如 0.5, 1.5, 2.5的情况。核心含义当小数部分恰好是 0.5时前一位是奇数→ 进位1前一位是偶数→ 舍去不进位具体例子# 保留整数看小数点前一位的奇偶性 1.5 → 前一位是 1奇数→ 进位 → 2 ✅ 2.5 → 前一位是 2偶数→ 不进位 → 2 ✅ 3.5 → 前一位是 3奇数→ 进位 → 4 ✅ 4.5 → 前一位是 4偶数→ 不进位 → 4 ✅ # 保留一位小数看小数点后第二位 1.25 → 第二位是 2偶数→ 不进位 → 1.2 ✅ 1.35 → 第二位是 3奇数→ 进位 → 1.4 ✅ 1.45 → 第二位是 4偶数→ 不进位 → 1.4 ✅python# 银行家舍入遇到 .5 时向最近的偶数舍入 print(round(1.5)) # 2 (1.5 → 最近的偶数是 2) print(round(2.5)) # 2 (2.5 → 最近的偶数是 2) ⚠️ 不是3 print(round(3.5)) # 4 (3.5 → 最近的偶数是 4) print(round(4.5)) # 4 (4.5 → 最近的偶数是 4) # 对比传统四舍五入 # 1.5→2, 2.5→3, 3.5→4, 4.5→5为什么会这样原因消除统计偏差让大数据集的总和更准确python# 传统四舍五入的偏差 numbers [1.5, 2.5, 3.5, 4.5] # 传统四舍五入2 3 4 5 14 (偏差 0.5) # 银行家舍入2 2 4 4 12 (无偏差) # 实际测试 print(sum(round(n) for n in numbers)) # 12完整示例python# 正数情况 print(round(0.5)) # 0 (偶数→0) print(round(1.5)) # 2 (奇数→2) print(round(2.5)) # 2 (偶数→2) # 负数情况同样规则 print(round(-0.5)) # 0 print(round(-1.5)) # -2 print(round(-2.5)) # -2 # 更多位数的情况 print(round(1.25, 1)) # 1.2 (1.25 → 最近的偶数小数点后1位是2) print(round(1.35, 1)) # 1.4 (1.35 → 3是奇数进位到4)如何实现真正的四舍五入方法1使用Decimal模块推荐pythonfrom decimal import Decimal, ROUND_HALF_UP # 真正的四舍五入 def round_half_up(n, decimals0): factor Decimal(10) ** (-decimals) return Decimal(str(n)).quantize(factor, roundingROUND_HALF_UP) print(round_half_up(2.5)) # 3 print(round_half_up(2.5, 0)) # 3 print(round_half_up(1.25, 1)) # 1.3 # 直接使用 Decimal d Decimal(2.5) print(d.quantize(Decimal(1), roundingROUND_HALF_UP)) # 3方法2自定义函数简单场景pythondef traditional_round(n, decimals0): factor 10 ** decimals return int(n * factor (0.5 if n 0 else -0.5)) / factor print(traditional_round(2.5)) # 3.0 print(traditional_round(2.5, 0)) # 3.0 print(traditional_round(1.25, 1)) # 1.3 print(traditional_round(-1.5)) # -2.0 (注意负数处理)方法3使用math.floor和math.ceilpythonimport math def round_half_up_alt(n): 正数四舍五入 return math.floor(n 0.5) if n 0 else math.ceil(n - 0.5) print(round_half_up_alt(2.5)) # 3 print(round_half_up_alt(-2.5)) # -3注意浮点数精度问题python# 浮点数存储不精确 print(round(2.675, 2)) # 2.67 (不是预期的 2.68!) # 因为 2.675 实际存储为 2.6749999999999998 # 解决方案使用 Decimal from decimal import Decimal print(Decimal(2.675).quantize(Decimal(0.01), roundingROUND_HALF_UP)) # 2.68实际应用建议场景推荐方法原因金融计算DecimalROUND_HALF_UP符合商业习惯精度可控科学计算round()减少统计偏差数据显示format()或f-string格式化不影响底层数据简单取整int(x 0.5)快速但注意负数python# 格式化显示采用四舍五入显示但不改变值 print(f{2.5:.0f}) # 2 (注意格式化也是银行家舍入!) print(f{2.5:.0f}) # 2 # 使用 format() print(format(2.5, .0f)) # 2总结Python 默认使用银行家舍入法需要传统四舍五入时请使用Decimal模块。