之前帮公司弄对账脚本,图省事直接拿 double 把几百笔订单金额累加,再跟系统总额比。逻辑看着没毛病,结果跑出来的差额是几分钱、几毛钱,时有时无,复现都复现不出来,差点被财务追着问。
根子就在 IEEE754。0.1+0.2 在浮点里根本不等于 0.3,二进制表示不了太多十进制小数,误差每累加一笔就偷偷攒一点。单笔看不出来,量一大就冒头,而且不是每次都冒,纯看脸。拿浮点直接 == 或者 != 比金额,基本是在给自己挖坑。
后来老老实实改成用整数分来存钱,或者上 decimal/定点数,比较的时候也丢个 epsilon 容差,不再裸比。一句话,钱这东西碰都别用浮点直接碰。我这种做外贸的,账对不上可不是闹着玩的,面包要紧。btw 现在凡是涉及钱的字段,一律整数处理,绝不手软。