刚入行那会儿接手一个对账脚本,逻辑简单到我以为闭眼都能写对:把一堆订单金额读出来相加,再跟系统总额比对。结果跑批第一天,账面上就差了一分钱。那一分钱害我 debug 到凌晨三点,最后定位到根上,是 float 在作妖。
0.1 加 0.2 在几乎任何语言里都不等于 0.3,打印出来是 0.30000000000000004 那一长串尾巴。底层原因是二进制压根没法精确表示某些十进制小数,单笔看着没事,批量累加几十万笔之后,误差就被悄悄攒大了。我当时就是拿 float 做金额累加,对完账才发现总额偏了一分。
后来学乖了:金额一律用整数分存,比较也别傻乎乎地用等号,改成看误差阈值;真要算钱的关键场景,直接上 decimal 类型。坑本身不大,但踩过一次就忘不掉了,毕竟凌晨三点的咖啡真不好喝。