前两天又被浮点数摆了一道,忍不住上来水一帖吐个槽。我对一批订单金额做累加对账…,前端清清楚楚写着19.9元,后端算出来却偏要差那么一分钱。盯着代码半天才反应过来:0.1和0.2在二进制里都是无限循环小数,塞进double那一刻精度就丢了,所以0.1+0.2得到的从不是0.3,而是那个著名的0.30000000000000004。
嗯从某种角度看这事儿特别反直觉。我们写代码时总默认小数就该老老实实待在那儿,可IEEE 754底下它只是个近似存储,直接拿==去比两个浮点数相等几乎注定失败。正经做法是比较两者差的绝对值是否小于一个极小的 epsilon 阈值,或者涉及钱的地方干脆别碰浮点,老老实实用整数分或者 decimal 类型。
我后来把金额全改成按分存整数,对账再没出过幺蛾子。这种坑教科书往往一句话带过,真踩进去才知道它多阴。你们有没有被哪个看似人畜无害的小数坑过?