WMX · 随记
·Python· 3 分钟阅读

Decimal:金额计算要把舍入规则写出来

用浮点表示金额后,在边界值上保留两位可能出现意外。财务规则需要明确十进制输入、精度和舍入方式,而不是只控制输出格式。

Python 系列概览:输入校验、数据处理与行为验证
Python 系列概览:输入校验、数据处理与行为验证 点击图片查看大图 ↗

问题从哪里出现

用浮点表示金额后,在边界值上保留两位可能出现意外。财务规则需要明确十进制输入、精度和舍入方式,而不是只控制输出格式。

理解核心机制

从字符串构造 Decimal 可以保留输入的十进制意义。quantize 指定结果的指数和舍入规则;局部上下文可以限制设置的影响范围。

动手做一个小实验

Python 3.11 或更新版本,仅使用标准库;将示例保存为 demo.py 后执行 python3 demo.py。

Python7 行 · 可横向滚动
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) 会保留该浮点数实际的二进制近似值,而不是恢复原始输入。先逐项舍入还是合计后舍入也可能产生不同结果。

继续练习

用三笔带第三位小数的金额,比较逐项舍入后求和与求和后舍入,并为你的业务选择明确策略。

参考资料

阅读相关官方文档或原始资料 ↗

← 返回文章归档