round() 函数用于对数字进行四舍五入,它非常常用,但有一些细节需要注意,尤其是涉及到“银行家舍入法”和浮点数精度的问题。

基本语法
round() 函数有两种主要用法:
- 只有一个参数:
round(number) - 有两个参数:
round(number, ndigits)
用法详解
round(number) - 四舍五入到最近的整数
当只提供一个数字参数时,round() 会将该数字四舍五入到最接近的整数。
示例:
# 正数,小数部分 >= 0.5,向上取整 print(round(3.7)) # 输出: 4 # 正数,小数部分 < 0.5,向下取整 print(round(3.3)) # 输出: 3 # 负数,小数部分 >= 0.5,向绝对值更大的方向取整 (更负) print(round(-3.7)) # 输出: -4 # 负数,小数部分 < 0.5,向绝对值更小的方向取整 (更接近0) print(round(-3.3)) # 输出: -3 # 正好是 0.5 的情况,见下面的“重要细节”部分 print(round(2.5)) # 输出: 2 (不是 3) print(round(3.5)) # 输出: 4 (不是 4)
round(number, ndigits) - 四舍五入到指定的小数位数
当提供两个参数时,第二个参数 ndigits 指定了要保留的小数位数,它可以是正数、零或负数。

示例:
# ndigits 为正数,保留指定小数位数 pi = 3.1415926535 print(round(pi, 2)) # 输出: 3.14 (保留两位小数) print(round(pi, 4)) # 输出: 3.1416 (保留四位小数) # ndigits 为 0,等同于只有一个参数的情况 print(round(3.14159, 0)) # 输出: 3.0 (注意返回的是浮点数) # ndigits 为负数,对小数点左侧进行四舍五入 print(round(12345, -1)) # 输出: 12340 (对十位进行四舍五入) print(round(12345, -2)) # 输出: 12300 (对百位进行四舍五入) print(round(12345, -3)) # 输出: 12000 (对千位进行四舍五入)
重要细节和注意事项
银行家舍入法(四舍六入五成双)
这是 round() 函数最需要注意的一个特性,当要舍入的数字部分正好是 0.5 时,Python 的 round() 采用的不是我们通常理解的“四舍五入”(即 0.5 总是向上进一),而是“银行家舍入法”(Round half to even)。
规则: 如果被舍弃部分的左边是偶数,则直接舍弃。 如果被舍弃部分的左边是奇数,则进一。
示例:

# 目标是整数 (ndigits=0) print(round(2.5)) # 2 的左边是 2 (偶数),所以舍弃 0.5,结果为 2 print(round(3.5)) # 3 的左边是 3 (奇数),所以进一,结果为 4 # 目标是小数点后一位 (ndigits=1) print(round(1.25, 1)) # 2 的左边是 2 (偶数),舍弃 0.05,结果为 1.2 print(round(1.35, 1)) # 3 的左边是 3 (奇数),进一,结果为 1.4
为什么这么做? 这种方法的优点是在处理大量数据时,可以减少因四舍五入带来的系统性偏差,使得结果总和更接近真实值,因此在财务和统计领域非常受欢迎。
浮点数的精度问题
计算机在存储浮点数时存在精度问题,所以你看到的 5 可能内部存储的值是 49999999999999994 或者 5000000000000001,这会导致 round() 的结果看起来不符合预期。
示例:
# 看起来是 2.675,想保留两位小数 # 但由于浮点数精度,它可能存储的值比 2.675 稍微小一点点 print(round(2.675, 2)) # 在某些系统上可能会输出 2.67 而不是 2.68 # 另一个例子 print(0.1 + 0.2) # 输出 0.30000000000000004,而不是 0.3 print(round(0.1 + 0.2, 1)) # 可能输出 0.3,也可能输出 0.2 或 0.4
如何处理?
如果你需要处理金融或对精度要求极高的场景,应避免使用 float 和 round(),而是使用 Python 的 decimal 模块。
与 format() 和 f-string 的区别
我们只是想“显示”数字,而不是“计算”数字,这时,使用格式化字符串会更合适,因为它们只影响显示,不改变原始数值的精度。
示例:
num = 3.14159
# 使用 round() 改变数值本身,返回一个新的数字
rounded_num = round(num, 2)
print(rounded_num) # 输出: 3.14 (这是一个新的浮点数对象)
print(type(rounded_num)) # 输出: <class 'float'>
# 使用 f-string 只改变显示,原始数值不变
print(f"{num:.2f}") # 输出: 3.14 (num 本身还是 3.14159)
print(num) # 输出: 3.14159
print(type(num)) # 输出: <class 'float'>
# 同样,format() 函数也只影响显示
print(format(num, '.2f')) # 输出: 3.14
round(): 用于计算,会返回一个新的、四舍五入后的数值。f-string/format(): 用于显示,只改变字符串的呈现方式,不改变原始数值。
实际应用示例
假设你在计算一个商品的平均评分:
scores = [5, 4, 4, 3, 5, 5, 2, 4]
average_score = sum(scores) / len(scores)
# average_score 可能是 4.0,也可能是 3.9999999999999996 或 4.000000000000001
# 使用 round() 将结果四舍五入到一位小数
final_score = round(average_score, 1)
print(f"原始平均分: {average_score}")
print(f"四舍五入后的平均分: {final_score}")
# 如果你想在表格中显示,可以这样:
print(f"商品评分: {final_score:.1f} / 5.0")
| 特性 | 描述 |
|---|---|
| 基本功能 | 对数字进行四舍五入。 |
| 语法 | round(number) 或 round(number, ndigits) |
ndigits |
正数:保留小数位数,0:舍入到整数,负数:舍入到小数点左侧。 |
| 核心规则 | 遵循“银行家舍入法”,当值为 0.5 时,舍入到最近的偶数。 |
| 浮点数陷阱 | 由于浮点数精度问题,结果可能不符合直觉。 |
| vs 格式化 | round() 改变数值,f-string/format() 只改变显示。 |
| 高精度需求 | 对于金融计算,优先使用 decimal 模块。 |
希望这个详细的解释能帮助你完全理解 Python 中的 round() 函数!
