四舍五入、截尾、进位与 0.1 + 0.2 问题 — 计算器尾数处理全解
讲解四舍五入、截尾(舍去)、进位的区别,金额尾数处理,银行家舍入法,计算机中 0.1 + 0.2 为何等于 0.30000000000000004,以及本计算器的处理方式。
百分比计算中除法和小数乘法很多,大多数情况下末位都除不尽。即使是同一个计算,尾数怎么处理也会让结果相差几元或几分,了解这些规则就能解释收据和报价单之间的差异。
三种尾数处理
- 四舍五入:要舍去的位数字为 5 及以上就进位,否则舍去。1,234.5 → 1,235
- 截尾(舍去):把要舍去的位全部舍去。1,234.9 → 1,234
- 进位(向上取整):要舍去的位不为 0 就进位。1,234.1 → 1,235
还可以改变单位。12,345 元按 10 元截尾是 12,340 元,按 100 元四舍五入是 12,300 元。
各自用在哪里
- 增值税税额:在韩国,舍去不足 1 韩元的尾数(截尾)是常见的实务做法
- 国税缴纳:在韩国,根据《国库金管理法》第 47 条,不足 10 韩元的尾数不予计算
- 门店折后价:各店做法不同,但常把折扣金额按 10 或 100 为单位截尾
- 统计与比率发布:通常四舍五入到小数点后一位或两位
- 所需数量(箱数、人数):不能不够,所以进位
负数的尾数
−2.5 四舍五入是 −3 还是 −2?本计算器按远离 0 的方向舍入,处理为 −3。截尾朝 0 的方向(−1.239 → −1.23),进位朝远离 0 的方向。无论金额正负,都对其大小(绝对值)适用同样的规则。
银行家舍入法
恰好为一半(…5)时向偶数方向舍入(2.5 → 2,3.5 → 4)。为了减少大量反复舍入时向一侧累积的误差,部分会计和编程环境会使用这种方法。日常计算和本计算器使用普通的四舍五入。
为什么计算机中 0.1 + 0.2 等于 0.30000000000000004
计算机以二进制存储数字。就像十进制中的 1/3 会成为无限循环的 0.333…,0.1 在二进制中也是无限小数,无法精确存储,只能舍入为非常接近的值后存储。因此在包括 JavaScript 在内的大多数语言中,计算 0.1 + 0.2 会得到 0.30000000000000004。
同理,把 1.005 四舍五入到小数点后两位的常见方法(toFixed(2))返回的是 1.00 而不是 1.01。因为 1.005 实际上被存储为 1.00499999…。
本计算器的处理方式
- 所有中间结果都整理到12 位有效数字,消除二进制表示带来的噪声。0.1 + 0.2 → 0.3
- 舍入时不做乘法,而是通过十进制指数表示移动小数位来处理。1.005 → 1.01,2.675 → 2.68
- 金额尾数可在折扣和增值税标签中选择单位(1、10、100 元等)和方式(截尾、四舍五入、进位)。
- 这种方式已经用 node 单元测试验证了边界值(1.005、−2.5、极小值和极大值)。
显示位数与实际值
页面上方的小数位数设置只改变结果显示的位数。1 ÷ 3 × 100 在内部是 33.3333333333,设为 2 位小数时显示为 33.33。复制按钮复制的是屏幕上显示的值。
小结
尾数处理规则不同导致结果相差几元,这不是错误,而是规则的差异。金额对不上时,请先确认 ① 在哪一步处理了尾数 ② 采用的单位和方式是什么。