3日がかりのその仕事、3分で終わらせる方法教えます!
パソコンスキルの心技体

VBAのRound関数は「銀行型丸め」に注意!

2011年12月26日
  • このエントリーをはてなブックマークに追加
  • follow us in feedly

エクセルマクロ・VBA達人養成塾 小川です。

キューバ旅行記、その67です。

ビニャーレスの谷からハバナへ。そして、さらにバラデロビーチへ。

まずは、ビニャーレスの谷からハバナへ。バスで3時間の道中。

エクセルマクロ達人養成塾塾長ブログ
ビニャーレスの谷からハバナへバスの、休憩所でのヒトコマ。

エクセルマクロ達人養成塾塾長ブログ
ビニャーレスの谷からハバナへバスの、休憩所でのフタコマ。

エクセルマクロ達人養成塾塾長ブログ
ビニャーレスの谷からハバナへバスの、休憩所でのミコマ。

エクセルマクロ達人養成塾塾長ブログ

エクセルマクロ達人養成塾塾長ブログ

ということで、ハバナのバスステーションに到着。この時点で、16時半。
これから1時間半ほどまって、18時のバスで、バラデロに向かいます。

塾長のキューバ旅行記、最初から読みたい方はこちらから


VBAのRound関数は「銀行型丸め」に注意!

今日は、いきなりサンプルコードを。

Sub BankerRoundingTest()
    Range(“A1”).Value = Round(0.5, 0)
    Range(“A2”).Value = Round(1.5, 0)
    Range(“A3”).Value = Round(2.5, 0)
    Range(“A4”).Value = Round(3.5, 0)
    Range(“A5”).Value = Round(4.5, 0)
    Range(“A6”).Value = Round(5.5, 0)
    Range(“A7”).Value = Round(6.5, 0)
    Range(“A8”).Value = Round(7.5, 0)

    Range(“B1”).Value = WorksheetFunction.Round(0.5, 0)
    Range(“B2”).Value = WorksheetFunction.Round(1.5, 0)
    Range(“B3”).Value = WorksheetFunction.Round(2.5, 0)
    Range(“B4”).Value = WorksheetFunction.Round(3.5, 0)
    Range(“B5”).Value = WorksheetFunction.Round(4.5, 0)
    Range(“B6”).Value = WorksheetFunction.Round(5.5, 0)
    Range(“B7”).Value = WorksheetFunction.Round(6.5, 0)
    Range(“B8”).Value = WorksheetFunction.Round(7.5, 0)
End Sub

結果は、こうなります。

      |A |B |
---------------
1 行目 |0 |1 |
---------------
2 行目 |2 |2 |
---------------
3 行目 |2 |3 |
---------------
4 行目 |4 |4 |
---------------
5 行目 |4 |5 |
---------------
6 行目 |6 |6 |
---------------
7 行目 |6 |7 |
---------------
8 行目 |8 |8 |
---------------

B列は、Worksheetfunction.Roundを使った結果。
A列は、Roundを使った結果です。

B列は、フツーの四捨五入をしていますが、A列は、「銀行型丸め」とも呼ばれる、特別な端数処理をしています。

「銀行型丸め」では、「端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める」というルールになっています。

どうしてこういう端数処理方法があるのかというと。

例えば。

以下のようなデータがあったとき。

データ1: 1.5
データ2: 0.5
データ3: 1.5
データ4: 0.5
データ5: 1.5
データ6: 0.5
データ7: 1.5
データ8: 0.5
データ9: 1.5

その合計を計算してみましょ。合計は、いくつになりますか?

…というと、まー、「9.5」になるんですが。

四捨五入してからその平均を取ると。

データ1: 2
データ2: 1
データ3: 2
データ4: 1
データ5: 2
データ6: 1
データ7: 2
データ8: 1
データ9: 2

としてから合計を取るわけですから、「14」なわけです。

…これ、実態と著しくかけ離れていますね。

ところが。

「銀行型丸め」してからその合計を取ると。

データ1: 2
データ2: 0
データ3: 2
データ4: 0
データ5: 2
データ6: 0
データ7: 2
データ8: 0
データ9: 2

の合計を取るので、これは、「10」となります。

生データの平均は、「9.5」でした。こちらのほうが、実態と近いですね。

てことで。

要は、
「0.5はくり上げ!」と決めているよりは、
「0.5については、くり上げるからくり下げるかは、フィフティー・フィフティーの確率!」
としておいたほうが、丸めたあとの値に信頼性が高い、ということです。

で、VBAのRound関数は、「銀行型丸め」をしているんですね。

ただ、「銀行型丸め」を普段から意図して使っている人はあまりいないですね。
それこそ、金融のやや特殊な仕事をしている人とかです。

特にそこまで考えず、「四捨五入」の計算をしたいということでしたら、
Worksheetfunction.Round を使ってください。

以下の動画で関連する内容がご覧いただけます。


ではでは ヾ(´ー`)ノ

キーワード

コメント

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

最新の記事

人気記事

最新記事

カテゴリ

最新コメント

タグクラウド