はじめに
四捨五入って一種類だと思っていませんか?私はずっとそう思っていました。
しかし残念ながら四捨五入は二種類あります。
銀行家の丸め(Banker's Rounding)とは?
「銀行家の丸め」とは、数値を四捨五入する時にちょうど中間(0.5)だった場合に、単純に切り上げるのではなく偶数に丸めるルールです。
通常の四捨五入と銀行家の丸めの違い
元の数値 | 通常の四捨五入 | 銀行家の丸め |
---|---|---|
2.5 | 3 | 2 |
3.5 | 4 | 4 |
4.5 | 5 | 4 |
5.5 | 6 | 6 |
ポイント:
- 小数点以下が「ちょうど.5」だったとき
- 通常の四捨五入 -> 無条件で切り上げ
- 銀行家の丸め -> 丸めた後が偶数になるように切り捨て、切り上げをする
なぜ銀行家の丸めを使うのか?
普通の四捨五入だと、「切り上げ」が統計的に偏り、数値が少し大きくなりやすいです。
ざっくばらんに説明すると[0.0, 0.1, 0.2, 0.3, ... , 1.9]の0.1刻みの20個の数字を考えると、
元の数字 | 通常の四捨五入 | 銀行家の丸め | 差(通常の四捨五入) | 差(銀行家の丸め) |
---|---|---|---|---|
0.0 | 0 | 0 | 0.0 | 0.0 |
0.1 | 0 | 0 | -0.1 | -0.1 |
0.2 | 0 | 0 | -0.2 | -0.2 |
0.3 | 0 | 0 | -0.3 | -0.3 |
0.4 | 0 | 0 | -0.4 | -0.4 |
0.5 | 1 | 0 ※ | 0.5 | -0.5 |
0.6 | 1 | 1 | 0.4 | 0.4 |
0.7 | 1 | 1 | 0.3 | 0.3 |
0.8 | 1 | 1 | 0.2 | 0.2 |
0.9 | 1 | 1 | 0.1 | 0.1 |
1.0 | 1 | 1 | 0 | 0 |
1.1 | 1 | 1 | -0.1 | -0.1 |
1.2 | 1 | 1 | -0.2 | -0.2 |
1.3 | 1 | 1 | -0.3 | -0.3 |
1.4 | 1 | 1 | -0.4 | -0.4 |
1.5 | 2 | 2 | 0.5 | 0.5 |
1.6 | 2 | 2 | 0.4 | 0.4 |
1.7 | 2 | 2 | 0.3 | 0.3 |
1.8 | 2 | 2 | 0.2 | 0.2 |
1.9 | 2 | 2 | 0.1 | 0.1 |
※通常の四捨五入と銀行家の丸めで差異がある箇所
それぞれの合計値は以下の通り
元の数字 | 通常の四捨五入 | 銀行家の丸め | 差(通常の四捨五入) | 差(銀行家の丸め) |
---|---|---|---|---|
19.0 | 20 | 19 | 1.0 | 0.0 |
このように通常の四捨五入では、小数点以下が「ちょうど.5」だったときに常に切り上げるので、多めになってしまう傾向があります。
一方銀行家の丸めは、中間の場合に偶数・奇数をバランスよく丸めるため、全体で誤差が偏りにくくなります。
特に、金融(銀行、保険)や科学技術の分野では、正確な統計処理が求められるため、この丸め方を採用されることがあります。
プログラミング言語毎における四捨五入
Python
Python言語に組み込みのround()関数は銀行家の丸めです。注意しましょう。
round(2.5) # -> 2
round(3.5) # -> 4
VBA
VBA言語のRound関数は銀行家の丸めです。注意しましょう。
?Round(2.5, 0)
2
?Round(3.5, 0)
4
Excel
Excelの数式のROUND関数は通常の四捨五入です。VBAと違うので注意です。
=ROUND(2.5, 0)
3
=ROUND(3.5, 0)
4
C
C言語のmath.hのround()関数は通常の四捨五入です。
round(2.5) // -> 3
round(3.5) // -> 4
JavaScript
JavaScript言語に組み込みのMath.round()関数は通常の四捨五入です。
console.log(Math.round(2.5), Math.round(3.5)); // 3 4
まとめ
- 銀行家の丸めとは、ちょうど0.5の場合に、偶数に丸める方法
- 偏りを防ぎ、統計的に正確な値に近づける目的で使い、金融、保険、科学技術計算などで使われる
- プログラミング言語毎で通常の四捨五入なのか銀行家の丸めなのかが異なるので注意が必要