上周帮人看对账,月底差三分钱,他查了一下午没查出来。扫了眼代码,金额全用的 float。坑就在这。
浮点数是拿二进制去近似十进制小数,0.1 和 0.2 在内存里都不是精确值,俩一加得到 0.30000000000000004,不是 0.3。单笔看不出事,可一旦在循环里反复累加,误差越滚越大,到对账那天你都不知道差从哪来的。
钱这东西,从一开始就用整数存分,或者上 Decimal 类型。比较也别直接写 a == b,带个容差,abs(a-b) < 1e-9 那种。简单说
其实我当过两年兵,带出来的习惯是凡涉及钱的事绝不赌"应该没问题",最坏的打算先摆这儿,再用最稳的办法兜住。那哥们后来把字段全改成 int 分,世界清净了。