前两天对账,发现余额少了三毛七。不是我算错,是 0.1 + 0.2 在多数语言里等于 0.30000000000000004。十进制里随手写的小数,换成二进制往往没法精确表示,只能取个最接近的近似值,每做一次运算误差就偷偷叠一点,平时看不出来,量一大全冒出来了。
我干过的蠢事是用 float 跑了个循环计数顺带累加金额,循环上万次,每次加一点,屏幕上看漂漂亮亮。月底合总数,差了几分钱。定位这坑花了半个下午,打印中间值才看见那串甩不掉的尾巴。
从那以后规矩就一条:钱一律按最小单位存整数,分就是 int,绝不动浮点;循环计数用 int;真要比较俩浮点相等,就放个阈值进去,abs(a