Decimal:金额计算要把舍入规则写出来
用浮点表示金额后,在边界值上保留两位可能出现意外。财务规则需要明确十进制输入、精度和舍入方式,而不是只控制输出格式。
问题从哪里出现
用浮点表示金额后,在边界值上保留两位可能出现意外。财务规则需要明确十进制输入、精度和舍入方式,而不是只控制输出格式。
理解核心机制
从字符串构造 Decimal 可以保留输入的十进制意义。quantize 指定结果的指数和舍入规则;局部上下文可以限制设置的影响范围。
动手做一个小实验
Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。
from decimal import Decimal, ROUND_HALF_UP, localcontext
with localcontext() as context:
context.prec = 28
price = Decimal("2.675")
rounded = price.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
assert rounded == Decimal("2.68")
print(rounded)适用边界与常见误区
Decimal(float_value) 会保留该浮点数实际的二进制近似值,而不是恢复原始输入。先逐项舍入还是合计后舍入也可能产生不同结果。
继续练习
用三笔带第三位小数的金额,比较逐项舍入后求和与求和后舍入,并为你的业务选择明确策略。