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 在中点时远离零舍入;Decimal 运算仍受 context.prec 的精度限制,较大数值量化时需设置足够精度。
常见问题(FAQ)
Q:round 后是 3.0 而不是 3.00?
A:数值不保留"位数"概念,3.0 和 3.00 是同一个数。需要显示两位小数用格式化。
Q:如何只截断不四舍五入?
A:float 的 int(x * 100) / 100 仍可能受二进制误差影响;精确十进制可从字符串构造 Decimal 并用 ROUND_DOWN,它表示向零截断,不是向负无穷取整。
Q:科学计数法输出怎么避免?
A:f-string 的 :.Nf 固定小数格式不会用科学计数法;:.Ne 才是科学计数法。