【シミュレーション】銀行家の丸め
五捨五入とも呼ばれる特殊な端数処理の方法「銀行家の丸め」について、説明・検証します。
「銀行家の丸め」とは
「銀行家の丸め」とは、端数が 0.5 より小さいなら切り捨て、0.5 より大きいなら切り上げ、0.5 ちょうどなら切り捨てと切り上げのうち偶数となる方に端数処理する方法です。
例を見てみましょう。
例:
1.32 → 1(四捨五入と同様)
1.52 → 2(四捨五入と同様)
1.50 → 2(偶数に丸め)
2.52 → 3(四捨五入と同様)
2.50 → 2(偶数に丸め)
2.50 → 2 の部分が通常の四捨五入と異なります。このように端数が0.5ちょうどのとき、偶数に丸めることから、「銀行家の丸め」は「偶数丸め」と呼ばれることもあるようです。
シミュレーション
「銀行家の丸め」は四捨五入に比べ、端数処理による誤差の累積が抑制されると言います(ゆえに、銀行家が好んで用いたことからその名がついた)。
誤差の累積の程度を四捨五入と比べてみました。
シミュレーションの概要:
1以上10以下で○.○の形の数値を一定個数発生させ、
・通常の平均
・それぞれ四捨五入した後、平均
・それぞれ「銀行家の丸め」した後、平均
を比較する。
以下は、シュミレーションの結果を示した表とグラフです。
結論
グラフの回帰直線から見て取れるように、
四捨五入は数値の発生数に依存せず一定の有効桁数、
銀行家の丸めは数値の発生数が大きいほど大きな有効桁数
となることがわかりました。
やはり、「銀行家の丸めの方が誤差の累積が少ない」と言えそうです。
エクセルとVBA全文
今回のシミュレーションに使用したエクセルです。
以下はVBAの全文です。
Option Explicit
Sub main()
Dim row As Long
Dim i As Currency
Dim numberRange As Range
Dim trueValueRange As Range
Dim sumRoundRange As Range
Dim sumBankersRange As Range
Set numberRange = Range("NUMBER")
Set trueValueRange = Range("TRUE_VALUE")
Set sumRoundRange = Range("SUM_ROUND")
Set sumBankersRange = Range("SUM_BANKERS")
Dim randomFigure As Double
Dim sumTrueValue As Currency
Dim sumRound As Currency
Dim sumBankers As Currency
row = 1
Do While numberRange(row)
sumTrueValue = 0
sumRound = 0
sumBankers = 0
For i = 1 To numberRange(row)
randomFigure = RndFigure
sumTrueValue = sumTrueValue + randomFigure
sumRound = sumRound + WorksheetFunction.Round(randomFigure, 0)
sumBankers = sumBankers + Round(randomFigure, 0)
Next i
trueValueRange(row) = sumTrueValue / numberRange(row)
sumRoundRange(row) = sumRound / numberRange(row)
sumBankersRange(row) = sumBankers / numberRange(row)
row = row + 1
Loop
End Sub
Function RndFigure() As Double
Randomize
RndFigure = WorksheetFunction.Round(10 * Rnd, 1)
End Function
―――――記事はここまで―――――
読んで下さりありがとうございます!