前两天帮人看个对账对不上的 bug,翻半天最后揪出一行 if (a == b)。这行看着没毛病,其实是个埋了好久的坑。
0.1 加 0.2,IEEE 754 底下算出来不是 0.3,是 0.30000000000000004。根子在二进制没法精确表示多数十进制小数,0.1 本身在二进制里就是无限循环,存进内存那一刻就已是近似值。拿两个近似值做 ==,差一个最低位整条判断就翻车。
最烦的是它不挑时候发作。某些输入路径下乖乖相等,换批数据或者换台机器,浮点运算顺序一变结果就飘,复现都复现不出,线上随机抽风。循环累加、金额扣减、坐标判定这些场景尤其要命,bug 跟着数据随机冒头,排查的人头秃。
正经做法是容差比较:fabs(a - b) < eps,eps 按你的精度需求取。算钱这种关键量干脆别用浮点,整数分或定点数存,从根上绕开。这坑谁都得踩一回,踩过就长记性了。