前几天改老代码又撞上这个坑。console 里敲一句 0.1 + 0.2,蹦出来的是 0.30000000000000004,不是 0.3。原因挺直白:十进制里 0.1 干干净净,换二进制就成了无限循环小数,IEEE 754 只给 53 个有效位,尾巴那截只能舍掉,误差从存储那一刻就埋下了。
最坑的不是单次差这么点,而是循环累加。把 0.1 加十次,你以为等于 1,实际差着个 epsilon。早年有兄弟拿 == 直接比金额,对账对到怀疑人生,账永远差几分钱对不平。
我的习惯:涉及钱一律用整数"分"存,展示层再除 100;要保精确小数位就上 decimal 定点数别用 float;两个浮点比大小也别硬等,abs(a-b) < 1e