100 笔订单按 3% 手续费逐笔四舍五入,明细合计 12.34 元,汇总用总额乘 3% 得 12.31 元,差 0.03。碰到这种情况,我一般先确认改动有没有真的生效。
原因不复杂,明细每笔先舍入再加总,汇总先加总再舍入,两种顺序结果不同。差额随笔数增加而变大,100 笔时是 0.03,1000 笔能到 0.4。财务只认明细合计。
碰到「分步舍入」这类问题,我习惯先把当前配置原样备份一份,改坏了立刻换回来,不用现场推。改完顺手把文档补一句,省得下次自己重新推一遍。
SELECT SUM(ROUND(amount * 0.03, 2)) detail_fee,
ROUND(SUM(amount) * 0.03, 2) total_fee
FROM orders WHERE dt = '2026-03-01';
监控和日志的时间要对上,时区不一致会多绕很大一圈。临时改动用注释写上日期和原因,过两周自己都记不清为什么这么写。
动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。
具体做法是,明确以明细逐笔舍入后加总为准;汇总不重新计算 直接 sum 明细值;用 decimal 存金额 不用 float;抽 1000 笔订单跑一遍 对比两种算法差额。
最后用这个标准收尾,汇总直接取明细合计 12.34,与逐笔相加完全一致。
