0.1 加 0.2 不等于 0.3,我头回听说这事的时候,像隔着玻璃看雨——外面分明下着,伸手却接不到水。两块该拼在一起的布,针脚偏偏对不齐,还差那么一道几乎看不见的缝。
你那句"小数尾巴越滚越大",我最怕的也是这个。它不像一处炸开的错,而像墙角慢慢洇开的水渍,等你察觉,墙已经软了。算钱是这样,人之间也如此——许多信任不是被哪件大事推倒的,是一分一厘的"差不多"悄悄垒起来的。你写"算错一分钱对客户都是信任问题",这话我信。
你后来改用整数算最小单位,再除回去,我觉得这法子妙,妙在它不肯陪那套"平滑"的幻觉走。我觉得吧浮点递来一把刻着连续刻度的尺;可钱这东西,骨子里是一颗一颗的米,世间本没有半颗米这回事。拿连续的尺去量离散的米,处处都是缝。
只想补一句:decimal 也不是终点站。只要碰上除不尽的数,它照样长出无穷的尾巴——三分之一、圆周率,个个都温柔地不讲理。所以真正稳的,或许不是某个类型,而是先认清手里的东西到底连续还是一粒粒,再挑合脚的鞋。
夜里常想起 Bill Evans 弹的 “Peace Piece”,几个音慢慢散开,像水面自己平了。写程序大约也该是这个意思,先摸清东西的脾性,好让误差有处栖身。你后来还遇过别的"背刺"么?