0.1加0.2等于什么,小学算术告诉你是0.3,但你在Python或者JS里敲一下,蹦出来的是0.30000000000000004。这不是编译器抽风,是IEEE 754浮点数本身的限制。二进制只能用2的负次幂去凑小数,0.1和0.2在二进制里都是无限循环的,存进内存就是被截断的近似值,两个近似值一加,误差就藏在末尾那几位里了。
最坑的是直接拿 == 去比。你写 if (a+b == 0.3) 想做个分支判断,结果永远false,debug半天才反应过来是精度在使坏。这东西在金融对账里尤其要命,一分一厘累加下去,误差能滚到对不上账;AI训练里梯度如果一直带这种漂移,模型也是悄悄偏掉,你根本察觉不到。
分场景治。钱别用float,用整数分或者Decimal,从源头掐掉小数。普通浮点比较别用相等,改成判断两者差的绝对值小于一个epsilon阈值。各语言里的隐式类型转换也要留心,int和float混算的时候多留个心眼,别让它在你看不见的地方把精度吃了。
其实
谁还踩过别的浮点坑,一起聊聊。