刚踩了个坑,顺手提醒还在用 == 比小数的朋友。
0.1 加 0.2 在机器里根本不等于 0.3,打印出来是 0.30000000000000004。原因很直白:十进制 0.1 转成二进制是个无限循环小数,塞不进固定位数,只能近似存。两个近似值一加,那点误差就浮上来了。
最阴的是它不报错。你写 if (a == b),编译照过、运行照跑,就是那个分支永远进不去。我当初拿这个对账,差一分钱死活对不上,查了半天才醒悟不是算错,是比错。
正解是别直接比相等,改成看差距有没有落在阈值内,比如 fabs(a-b) < 1e-9。要是碰上金额、坐标这种会一路累加的,干脆用整数分或者定点数,从源头把小数掐死。小数点后那几位看着人畜无害,攒多了照样让你账对不上。