昨晚对账,一笔金额死活对不上,差一分钱,像个甩不掉的影子,缠了我大半个晚上。翻了半天才明白,是浮点数的老把戏。
话说回来我们总以为机器算得精准,可 0.1 加 0.2,在多数语言里偏偏不等于 0.3。二进制本就没法精确装下大多数小数,那点舍入误差藏在尾数里,肉眼看不见,逻辑却在边界处静默地塌了。用 == 比较两个浮点数,就像用尺子去量风,你以为对齐了,其实永远差着那么一丝。
这丝误差惹的祸不少:布尔标志莫名丢失,while 循环转成了永动机,最要命的是钱。账对不上那一分,半夜盯着屏幕的孤单,你们大概都尝过。
后来学乖了,比较时总留一道容限,给个 epsilon,让"差不多"也作数。真要碰钱,就老老实实改用整数或定点数,把分币当最小单位来数。floating point 这东西,sounds like a quiet lesson the machine teaches you, 不声不响,却总在你想懈怠时轻轻绊一脚。