Python 中如何限制浮点数的小数位数?
Python 保留 N 位小数:round(x, 2) 返回数值;f"{x:.2f}" 返回格式化字符串;decimal 模块精确十进制运算。本文对比各方法及四舍五入陷阱。
两种思路:要数值用 round(x, 2);要显示用 f-string f"{x:.2f}"。注意 round 是银行家舍入,金额场景建议用 decimal 模块。
round():保留数值类型
x = 3.14159265
round(x, 2) # 3.14(仍是 float)
格式化输出:f-string / format / %
x = 3.14159265
f"{x:.2f}" # "3.14"
"{:.2f}".format(x) # "3.14"
"%.2f" % x # "3.14"
返回字符串,适合展示。
round 的坑:银行家舍入 + 浮点表示
round(2.5) # 2(不是 3!向偶数取整)
round(0.575, 2) # 0.57(0.575 实际存的是 0.57499...)
精确十进制:decimal 模块
金额、财务计算不要用 float:
from decimal import Decimal, ROUND_HALF_UP
x = Decimal("0.575")
print(x.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)) # 0.58
Decimal("0.575") 用字符串构造避免浮点误差,ROUND_HALF_UP 是我们熟悉的"四舍五入"。
常见问题(FAQ)
Q:round 后是 3.0 而不是 3.00?
A:数值不保留"位数"概念,3.0 和 3.00 是同一个数。需要显示两位小数用格式化。
Q:如何只截断不四舍五入?
A:int(x * 100) / 100;或 Decimal 配合 ROUND_DOWN。
Q:科学计数法输出怎么避免?
A:f-string 的 :.Nf 固定小数格式不会用科学计数法;:.Ne 才是科学计数法。