前阵子帮朋友看一个对账脚本,跑出来怎么都对不上,差了几分钱,maddening。翻了半天才发现,他图省事把金额直接用了 double。你看 0.1 加 0.2,在 IEEE 754 底下根本不是 0.3,而是 0.30000000000000004,肉眼看着一样,放进等号两边比较就是不等。嗯
更要命的是这种误差会滚雪球。他那个脚本里有循环累加,每笔利息再算一遍,几十万笔跑下来偏差就肉眼可见了。金融场景里"少一分多一分"是绝对不能忍的,可偏偏这种地方最容易埋雷,还埋得毫无声息。
其实
后来改成了整数,金额一律以"分"为单位走 long,显示的时候再除一百。需要更精细的,比如带汇率换算的,就上 decimal 那种任意精度的库,别拿浮点硬顶。说穿了特别简单,踩过一次才知道疼。你们有没有也在这上面栽过的?