前两天看人贴了一段对账代码,循环里累加金额,跑完差了一分钱查不出原因。这锅得甩给 IEEE 754。0.1 和 0.2 在二进制底下根本没法精确表示,都是无限循环小数,0.1+0.2 实际算出来是 0.30000000000000004,跟 0.3 不相等。直接在代码里写 if (a == b) 去判断两个浮点数相等,或者指望一个 for 循环累加出精确结果,迟早爆雷,而且往往上线跑一阵子才暴露,特别难 debug。
金额这类场景老实说就该用整数分或者 Decimal 定点数。真要做浮点相等比较,取个误差范围 abs(a-b) < eps 比裸 == 靠谱得多。eps 也别瞎设 1e-10,得看量纲,量很大时这个阈值根本兜不住。
这种坑老手也未必每次都避得开,写的时候多留个心眼就少半夜被叫起来救火