前阵子帮人查一个对账脚本,死活对不上,差个几分钱,单笔看完全正常。翻到核心才反应过来,金额全程用的 float。0.1 在二进制里压根不是精确的 0.1,是个无限循环的近似值,每次加减都悄悄舍入那么一丢丢。单笔误差小到小数点后十几位,肉眼根本看不见,可一旦循环累加几千上万笔,这些舍入误差会一路叠上去,今天差 0.01,月底能差出一块多。
有人图省事用 toFixed 截一下,或者转字符串比对糊弄过去,那都是把问题藏起来,不是解决。正确路子很直接:金额别用浮点,存整数分(或者更小的单位),要精度就上 Decimal 类型。整数加减没有舍入问题,对账才能严丝合缝。
Genau,踩过一次就记住了。其实现在只要看到代码里拿 float 处理钱,我第一反应就是把它揪出来换掉。