ZetCode

Python round 函数

上次修改时间:2025 年 4 月 11 日

这份全面的指南探讨了 Python 的 round 函数,该函数返回一个四舍五入到指定位数的浮点数。我们将介绍基本用法、精度控制以及数字四舍五入的实际示例。

基本定义

round 函数返回一个四舍五入到小数点后指定位数的浮点数。 如果没有给出精度,则四舍五入到最接近的整数。

主要特征:适用于数字,遵循“四舍六入五成双”规则(银行家舍入),并且在指定精度时返回一个浮点数。

基本四舍五入用法

以下是使用不同数字的简单用法,展示了 round 如何处理各种情况,无论是否指定精度。

basic_round.py
# Rounding to nearest integer
print(round(3.14))    # 3
print(round(3.5))     # 4 (note: bankers rounding)
print(round(3.6))     # 4
print(round(-3.14))   # -3
print(round(-3.5))    # -4

# Rounding with precision
print(round(3.14159, 2))  # 3.14
print(round(3.14159, 3))  # 3.142

此示例展示了 round 使用不同的数字。 如果没有精度,它将四舍五入到最接近的整数。 请注意 0.5 情况下的银行家舍入。

使用精度参数,它将四舍五入到指定的十进制位。 即使使用指定的精度四舍五入到整数,该函数也会返回一个浮点数。

银行家舍入解释

Python 使用“四舍六入五成双”(银行家舍入),它最大限度地减少了统计运算中的偏差。 此示例演示了该行为。

bankers_rounding.py
print(round(2.5))    # 2 (rounds to even)
print(round(3.5))    # 4 (rounds to even)
print(round(4.5))    # 4 (rounds to even)
print(round(5.5))    # 6 (rounds to even)

print(round(-2.5))   # -2
print(round(-3.5))   # -4

银行家舍入将 0.5 情况四舍五入到最接近的偶数。 这与传统的“四舍五入”不同,但提供了更好的统计属性。

相同的规则适用于负数。 请注意 -2.5 如何四舍五入为 -2(最接近的偶数),而不是 -3。

精度控制

精度参数控制小数点后保留多少位数字。 此示例显示了各种精度级别。

precision.py
pi = 3.141592653589793

print(round(pi, 0))   # 3.0
print(round(pi, 1))   # 3.1
print(round(pi, 2))   # 3.14
print(round(pi, 3))   # 3.142
print(round(pi, 4))   # 3.1416

# Negative precision rounds to left of decimal
print(round(12345, -1))  # 12340
print(round(12345, -2))  # 12300
print(round(12345, -3))  # 12000

正精度值在小数点后四舍五入,而负值在小数点左侧四舍五入(十位、百位等)。

请注意,precision=0 返回一个浮点数 (3.0),而不是一个整数,这与未指定精度时(返回一个整数)不同。

浮点考虑事项

由于浮点表示,某些结果可能会令人惊讶。 此示例演示了四舍五入可能无法按预期运行的情况。

floating_point.py
print(round(2.675, 2))  # 2.67 (not 2.68)
print(round(0.1 + 0.2, 1))  # 0.3 (as expected)

# Explanation
from decimal import Decimal
print(Decimal(2.675))  # Shows actual stored value

第一个示例显示 2.675 向下舍入为 2.67 而不是向上舍入为 2.68。 发生这种情况是因为 2.675 无法以二进制浮点精确表示。

对于精确的十进制运算,请考虑使用 decimal 模块,该模块提供精确的十进制表示和舍入。

实际应用:财务计算

此示例演示了在财务计算中使用 round,其中通常需要精确的舍入。

financial.py
def calculate_interest(principal, rate, years):
    return round(principal * (1 + rate/100)**years, 2)

def calculate_monthly_payment(principal, rate, months):
    monthly_rate = rate / 100 / 12
    payment = principal * monthly_rate / (1 - (1 + monthly_rate)**-months)
    return round(payment, 2)

print(calculate_interest(1000, 5, 10))  # 1628.89
print(calculate_monthly_payment(10000, 7.5, 60))  # 200.38

财务计算通常需要将货币四舍五入到小数点后 2 位。 当精确精度不是至关重要时,round 函数非常适合此目的。

对于需要精确十进制表示的银行应用程序,建议使用具有基于上下文的舍入的 decimal 模块。

最佳实践

资料来源

作者

我叫 Jan Bodnar,是一位充满激情的程序员,拥有丰富的编程经验。 自 2007 年以来,我一直撰写编程文章。 迄今为止,我已经撰写了超过 1,400 篇文章和 8 本电子书。 我拥有超过十年的编程教学经验。

列出所有 Python 教程