四捨五入・切り捨て・切り上げと 0.1 + 0.2 問題 — 計算機の端数処理のすべて
四捨五入・切り捨て・切り上げの違い、1円単位の端数処理、銀行型丸め、コンピューターで 0.1 + 0.2 が 0.30000000000000004 になる理由と、この計算機の処理方法を解説します。
パーセント計算は割り算や小数の掛け算が多く、端数がきれいに割り切れないことがほとんどです。同じ計算でも端数をどう処理するかによって数円・数セントが変わるので、ルールを知っておけばレシートや見積書の差を説明できます。
3つの端数処理
- 四捨五入: 捨てる桁が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円単位で切り捨てることが多い
- 統計・比率の発表: 小数第1位・第2位での四捨五入が一般的
- 必要な数量(箱・人数): 足りなくてはいけないので切り上げ
負の数の端数
−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 になるのか
コンピューターは数値を2進数で保存します。10進数の1/3が0.333…で終わらないように、0.1は2進数では無限に続く小数なので正確には保存できず、ごく近い値に丸めて保存されます。そのため、JavaScriptを含むほとんどの言語で0.1 + 0.2を計算すると0.30000000000000004になります。
同じ理由で、1.005を小数第2位に丸めるよくある方法(toFixed(2))は1.01ではなく1.00を返します。1.005が実際には1.00499999…として保存されているからです。
この計算機の処理方法
- すべての途中結果を有効数字12桁で整え、2進表現のノイズを取り除きます。0.1 + 0.2 → 0.3
- 丸めは数値を掛け算せず、10進の指数表記で桁を移動して処理します。1.005 → 1.01、2.675 → 2.68
- 金額の端数は、割引・消費税タブで単位(1・10・100円など)と方式(切り捨て・四捨五入・切り上げ)を選べます。
- この方式は node の単体テストで境界値(1.005、−2.5、非常に小さい値・大きい値)を検証しました。
表示桁数と実際の値
画面上部の小数桁数の設定は、結果を表示する桁数だけを変えます。1 ÷ 3 × 100 は内部的には33.3333333333で、小数2桁にすると33.33と表示されます。コピーボタンは画面に表示された値をコピーします。
まとめ
端数処理のルールが違えば結果が数円変わるのは、エラーではなくルールの違いです。金額が合わないときは、① どの段階で端数を処理したか ② 単位と方式は何か、から確認しましょう。