前阵子排查一个距离排序的 bug,数据明明该按顺序排,结果总有几个位置错位。盯了半天日志才反应过来,问题出在一句 if (a + b === 0.3) 上。
说起来有点反直觉,0.1 和 0.2 在二进制里都是无限循环小数,IEEE 754 双精度只好截断存近似。所以 0.1 + 0.2 算出来其实是 0.30000000000000004,跟字面量 0.3 根本不是同一个数,判等自然永远失败。这种错最烦人的地方在于它不报错,程序安安静静就把脏数据喂给了下游。
后来我们统一了写法,浮点比较一律改成容差判断,abs(a - b) < 1e-9 才算相等;涉及金额的一律上整数,按分计,从源头避开截断。这种坑书里都写,真踩上了还是得自己疼一次才记得住。