在 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