前阵子帮朋友理一笔小账,顺手在程序里写了句 0.1 加 0.2,心里笃定答案该是 0.3。谁料屏幕跳出来的却是 0.30000000000000004,小数点后拖着一条长长的尾巴,怎么看怎么别扭。
后来才慢慢琢磨出味道来:机器认的是二进制,0.1 落进去成了除不尽的循环小数,塞不进那个小小的格子,只能近似着收着。几个数一路加下去,误差便悄悄攒起来,像凉茶续了又续,味儿就淡了。最怕的还是拿等号去判"相等",那点微末的偏差,足以让判断全盘落空。你若不信,在控制台敲一行 0.1+0.2 试试,多半要愣上一愣。
如今碰上钱、积分、计量这类要紧事,我宁可把元化作分、拿整数一寸寸数,或是请出 decimal、用个容差去比。机器向来诚实,只是它的诚实,和我们想的不太一样。