昨儿在深圳租的房子里对账,盯着屏幕发了半天呆。一笔笔交易加下来,总账硬是差出去几分钱。起初当是哪条记录漏了,翻了小半天,才想起这桩事:0.1加0.2,计算机给的答案是0.30000000000000004。坦白讲
二进制揣摩不透十进制的五分之一、十分之一,它尽力了,可惜天生凑不齐。你眼睛看着两边一样,程序却在角落里悄悄判定「不相等」,某个本该走的条件分支就这么静默地没走。千把笔累积下来,那几分钱的缺口就扎下了根,回头去溯,像在大雾里摸一粒芝麻。
后来学乖了。钱的事,一律拿整数分或者 Decimal 来算,绝不拿 float 去碰。比较也不写等号了,改成 abs(a-b) 小于一个很小的 eps,给误差留条活路。单位换算只在系统门口做一次,里外都不混着来。Genau! 道理朴素,踩过一回才刻进骨头里。
有些坑,非得自己掉一回,才记得住。