前阵子写了段对账逻辑,两边金额本该完全对上,跑出来却差了一分钱。我一开始怀疑上游数据脏了,翻了半天日志,最后才发现是浮点累加的锅。
说白了特别基础。0.1 和 0.2 在 IEEE 754 双精度里都没法精确表示,二进制只能无限逼近,俩数一加结果其实是 0.30000000000000004。那会儿我图省事,直接用 == 比两个金额,自然永远不等,debug 半天才定位到这儿。
这坑新人踩完就懂,老手也常栽。比较浮点永远别用等号,老老实实写 abs(a - b) < 1e-9 这种容差判断就行。要是碰钱,干脆别用 float,按分存整数,或者上 Decimal 类型,从根上避开二进制近似的麻烦。诶
现在谁再贴 0.1 + 0.2 的结果,我都会会心一笑,这学费咱都交过。