杰瑞科技汇

Python中round函数用法详解

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

Python中round函数用法详解-图1
(图片来源网络,侵删)

基本语法

round() 函数有两种主要用法:

  1. 只有一个参数: round(number)
  2. 有两个参数: 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 指定了要保留的小数位数,它可以是正数、零或负数。

Python中round函数用法详解-图2
(图片来源网络,侵删)

示例:

# 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)。

规则: 如果被舍弃部分的左边是偶数,则直接舍弃。 如果被舍弃部分的左边是奇数,则进一。

示例:

Python中round函数用法详解-图3
(图片来源网络,侵删)
# 目标是整数 (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

如何处理? 如果你需要处理金融或对精度要求极高的场景,应避免使用 floatround(),而是使用 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() 函数!

分享:
扫描分享到社交APP
上一篇
下一篇