php -r 'echo round(299 * 1.5);'
// 期望输出 449

299 元订单按 1.5 倍应得 448.5 分,实际到账 448,一百单下来少了 50 分,用户拿明细来问。先别急着动参数,把报错原文和时间点记下来,顺序反了容易白折腾。

原因不复杂,积分字段是整数,代码里用取整函数直接截断小数。退款按同样比例倒算时又用了另一套取整方式,正负对不上。

围绕「积分计算精度」排查时,命令行跑一遍比在面板里点十次有用,面板会替你做掉不少隐式操作。动手前把原文件复制一份带时间戳,出问题立刻换回去,比现场分析快得多。

一次只改一处,改完立刻验证,几个改动叠在一起,出问题就说不清是谁导致的。

处理上按这个顺序:统一用四舍五入,规则写在一个计算函数里;需要更细的精度就按百分之一分存整数,展示时再除;退款扣回用同一个函数,参数取负;拿 299、199.9 这类金额各跑一遍核对结果。

改完只确认一件事:相同金额多次下单得分一致,退款扣回与发放数额相等。

作者 9823189