前两天帮人看代码,他在循环里给账户余额累加利息,跑了几十万次之后尾数悄悄飘了,对账对到怀疑人生。他一口咬定是编译器抽风,其实锅在浮点数自己身上。
计算机按 IEEE 754 用二进制存小数。0.1 和 0.2 在二进制里都是无限循环小数,压根凑不出一个干净的 0.3,真实结果是个 0.30000000000000004。单看一次误差小得可怜,可一旦进循环累加、做金额结算,或者拿 == 直接判相等,错就一层层放大了。
我早年写 C 的时候也在这种地方栽过。靠谱的做法就两条:碰钱一律用整数分或者 Decimal 来存,别让浮点沾边;判断相等改成误差阈值,abs(a