ENGINEERING NOTE 29 / 50 · CARD

避免卡片费用计算中的浮点误差

OPEN RAMBO ·

金额必须有明确币种和精度。累计财务金额时,不宜默认使用二进制浮点数。

本文由 OPEN RAMBO 发布。工程方案和伪代码用于说明设计,不是现有产品 API 文档;示例数字均为演示。

选择规范表示

固定币种精度可用最小单位整数,便于比较与汇总。其他资产可能需明确小数位的十进制表示。不能假设所有币种两位小数,也不能假设所有上游单位相同。

在明确边界舍入

说明百分比费用何时舍入及规则。逐行舍入可能不同于总额最后舍入。操作保留接受的价格版本,后续变价不能改变历史核算。

测试边界金额

覆盖零、最小金额、舍入临界值和最大金额。跨语言序列化整数需安全。展示两位小数不能掩盖底层算术差异。

示意流程

amount_minor = 1234
fixed_fee_minor = 50
net_minor = amount_minor - fixed_fee_minor
assert net_minor == 1184

如何验收

使用精确计算比较明细与账本总额,测试包含不同精度币种。

继续阅读