在 Python 中,round()函数用于将一个浮点数四舍五入到指定的小数位数。

函数语法

round(number, ndigits=None)

参数:

  • number:要四舍五入的数字;
  • ndigits:可选参数,要保留的小数位数,默认为None

round()函数使用银行家舍入法,也叫四舍六入五成双法,对于要保留的最后一位数字:

  • 四舍:如果要舍弃的部分< 0.5,则直接舍弃;
  • 六入:如果要舍弃的部分> 0.5,则进位;
  • 五成双:如果要舍弃的部分= 0.5,则向最近的偶数舍入;

round() 函数示例

常见用法:

print(round(3.14))      # 3
print(round(-3.14))     # -3
#指定保留的小数位
print(round(3.14, 1))    # 3.1
print(round(3.14, 2))    # 3.14
# 负的 ndigits
print(round(1234.56, -1))   # 1230.0
print(round(1234.56, -2))   # 1200.0
print(round(1234.56, -3))   # 1000.0

舍入的部分正好是5,向最近的偶数舍入:

print(round(0.5))  # 0
print(round(1.5))  # 2
print(round(2.5))  # 2
print(round(3.5))  # 4
print(round(4.5))  # 4

print(round(1.25, 1))  # 1.2
print(round(1.35, 1))  # 1.4
print(round(1.45, 1))  # 1.4
print(round(1.55, 1))  # 1.6

浮点数精度问题

在下面这个例子中,存在一个浮点数的精度问题:

print(round(2.675, 2))  # 2.67
print(round(2.685, 2))  # 2.69

这是因为2.675在二进制中无法精确表示,它的实际值可能是:

x = 2.675
y = 2.685
print(f"{x} 实际值: {x:.20f}")
print(f"{y} 实际值: {y:.20f}")
2.675 实际值: 2.67499999999999982236
2.685 实际值: 2.68500000000000005329

使用 Decimal 类型

使用Decimal类型能更精确的表达浮点数:

from decimal import Decimal

x = Decimal('2.675')
y = Decimal('2.685')
print(round(x, 2))   # 2.68
print(round(y, 2))   # 2.68

传统四舍五入

传统四舍五入规则如下:

  • 四舍:如果要舍弃的部分< 0.5,则直接舍去;
  • 五入:如果要舍弃的部分>= 0.5,则进位;

下面这个示例是传统四舍五入的 Python 实现:

from decimal import Decimal, ROUND_HALF_UP, getcontext
import math

def traditional_round_decimal(number, ndigits=0):
    
    # 转换为 Decimal
    if isinstance(number, Decimal):
        dec_number = number
    else:
        dec_number = Decimal(str(number))
    
    # 设置舍入模式
    exponent = Decimal(f'1e-{ndigits}')
    result = dec_number.quantize(exponent, rounding=ROUND_HALF_UP)
    
    return result

print(traditional_round_decimal(3.14159,3)) # 3.142