为什么round(5.445,2)是5.44,如何改成5.45?
要实现传统四舍五入(非银行家舍入法),可通过以下两种方法修正:
# 方法一:通过微调规避浮点精度问题
value = 5.445
epsilon = 1e-8 # 添加微小偏移量
result = round(value * 100 + epsilon) / 100
print(result) # 输出5.45# 方法二:使用decimal模块精确控制
from decimal import Decimal, ROUND_HALF_UP
result = Decimal('5.445').quantize(Decimal('0.00'), rounding=ROUND_HALF_UP)
print(float(result)) # 输出5.45
关键原理:
- Python的
round
函数采用「银行家舍入法」(四舍六入五取偶),对于5.445
这类中间值会舍入到最近的偶数5.44
- 添加
epsilon=1e-8
微调后,5.445*100=544.5
变成544.50000001
,触发四舍五入进位 decimal
模块的ROUND_HALF_UP
模式直接实现传统四舍五入规则
注意事项:
- 若直接使用浮点数
Decimal(5.445)
会因精度损失失效,必须用字符串初始化 - 方法一适用于快速修正数值计算,方法二适合金融等需要精确十进制运算的场景