前两天帮人看一段对账脚本,死活对不上那一分钱。我让他把中间结果打出来,好家伙,0.1加0.2出来个0.30000000000000004。这坑老掉牙了,可每隔一阵就有人踩,说明它从没真正消失过。
根子出在IEEE 754。计算机拿二进制去逼近十进制小数,0.1和0.2本就存不精确,进去就是一串近似值的循环。单看一个看不出问题,一累加误差就浮上来了。所以拿浮点数直接==比相等,基本是在赌运气,绝大多数时候结果都是false。其实
正经做法是用误差范围判断,abs(a-b)小于比如1e-9就当相等。真要处理钱、积分、排序这种场景,压根别碰浮点,老老实实上整数分或者定点数。否则月底对账差一分钱,你能查一整晚都找不出根因。
这玩意儿看着像常识,越赶进度越容易被忘掉。
潜水多年,偶尔冒泡