「round」タグアーカイブ

Round関数について、四捨五入より誤差が少なくなる偶数丸め(五捨五入・銀行丸め)だが、使い方には注意が必要

 この前、四捨五入でちょっとはまったんで、メモとして書いておきます。

 Excelで四捨五入といえば、Round関数ってのがあって、これを使うと四捨五入になる。例えば、セルA1に”1.5″、セルB1に”=Round(A1,0)”と入力して、Enterキーをバシッとやると”2″となるし、セルA2に”2.5″、セルB2に”=Round(B1,0)”ってやってバシッとやっても”3″になり、普通に四捨五入になってることがわかる。

 ところが、これをエクセルのマクロ(VBA)でやると、違った結果になる。エクセルのワークシート関数のRoundは四捨五入だが、VBAのRoundは「偶数丸め」(「五捨五入」とか「銀行丸め」とも)というやつで、ちょうど0.5のとき偶数になるように切り捨てか切り上げかが選択される。

 例をあげるとわかりやすいんで、1.5を偶数丸めする場合、切り捨てだと1、切り上げだと2になるが、偶数になるように、ということなので1.5の場合は2となる。2.5を偶数丸めすると、切り捨ては2、切り上げは3となり、切り捨ての偶数の2が選択される、以下、3.5なら4、4.5なら4って感じになる。

四捨五入と偶数丸めの比較
四捨五入と偶数丸めの比較

 これの利点は、四捨五入だと、真ん中は全部切り上げられてしまうので、プラスの数字はより大きく、マイナスもより大きくなってしまうが、偶数丸めはそこのところを半々に切り分けているので、誤差が少なくなり、金額計算などより精度の高い計算結果が欲しい場合に有用となる。実際、銀行で使われてたので、英語でbankers’ roundingとも言うらしいし、日本語でも「銀行丸め」という場合もあるみたい。

 プログラミング言語によっては引数で丸め方を指定できる場合もあるが、そういうのがない言語もあるし、引数なしで使う場合のデフォルトの挙動も言語によってまちまちなようなので、いずれの丸め方を使うか、ちゃんと意識しておかないと、私みたいにはまることになります……。ロジックは同じなのに言語が違うと合わないってことが起こりえます。

 ちなみに、この丸め方の日本語での使われ方が気になったので、ググッてみたが、こんな結果になった。

"JIS丸め" 四捨五入    - 約 3,010 件(単独 約 3,370 件)
"銀行丸め" 四捨五入   - 約 2,440 件(単独 約 2,580 件)
"ISO丸め" 四捨五入    - 約 2,350 件(単独 約 2,360 件)
"偶数丸め" 四捨五入   - 約 1,140 件(単独 約 3,290 件)
"五捨五入" 四捨五入   - 約 1,000 件(単独 約 2,040 件)
"最近接丸め" 四捨五入 - 約   133 件(単独 約   193 件)
"偶捨奇入" 四捨五入   - 約   261 件(単独 約   598 件)

 Wikipedia英語版のRoundingの項によると、英語では、以下のような呼び名があるらしい。同じくググッて件数調べてみた。日本語で言う「最近接丸め」がよく使われてるようで。

"round-to-nearest" 約 186,000 件 
"banker's' rounding" 約 9,800 件
"bankers' rounding" 約 5,490 件
"unbiased rounding" 約 6,070 件
"convergent rounding" 約 4,770 件
"statistician's rounding" 約 1,270 件 
"Gaussian rounding" 約 649 件
"odd–even rounding" 約 435 件
"Dutch rounding" 約 424 件

 昔から四捨五入って五が切り上げ側にされてて、なんか不公平だなと思ってたが、この偶数丸めは公平性があって、知った時は、四捨五入やめて、全部これにしたらええやん、って思ったものだが、世の中、そんなに精度が高いのは常に必要ではないし、四捨五入は何よりもルールが簡潔でわかりやすいので、このままでええねん。