皆さんはExcel(エクセル)の関数なんかはよく使われますかね?私は仕事がらExcelをよく使うので、関数もぼちぼち使うシーンがあります。
Excelで四捨五入する関数と言えばRound関数(ラウンド関数)ですよね。これはExcelをそれなりに使う人ならすぐ出てくると思います。
でもExcelで使えるROUND関数って、必ずしも四捨五入じゃないってこと、知ってますか?
例えば、2.5をROUND関数を使って整数にするとどうなるかわかりますか?答えは「3」・・・にならない場合があるんですよ、これが。
今回はそんなROUND関数のお話です。
ROUND関数は2種類ある
最もよく知られたROUND関数の端数処理は「四捨五入」でしょう。っていうか、むしろこれ以外あるの?って感じの人が大半だと思います。
例えばExcelのセルに以下のような数式を入力してみます。
▼セルに「=ROUND(2.5, 0)」と入力してみる。「0」は四捨五入した結果、小数点第○位に丸めたいという指定になります。つまり整数になります。
結果は「3」になりましたね。予想通りだと思います。このようにワークシートの関数として使うROUND関数はまあいんですよ。
でもね、同じExcelでもVBA(Visual Basic for Application)、通称マクロで使用できるRound関数を使ってみるとどうなるか見てみましょう。
▼こんな感じで簡単なマクロを組んでみます。
単純にRound(2.5, 0)の結果をメッセージボックスに表示するだけのコードです。
▼これを実行した結果がこれ。
結果が「2」になっているのがわかりますか?そうです、3にならないんです。
偶数に丸める偶数丸め(銀行丸め)
2.5が3にならない四捨五入って何なの!?って思うかもしれませんが、それはそもそも四捨五入ではなく「偶数丸め(銀行丸め)」と呼ばれる端数処理の種類の1つになります。
端数が0.5より小さいなら切り捨て、端数が0.5より大きいならは切り上げ、端数がちょうど0.5なら切り捨てと切り上げのうち結果が偶数となる方へ丸める。JIS Z 8401で規則Aとして定められていて、規則B(四捨五入)より「望ましい」とされている。
※端数処理 – Wikipediaから引用
つまり、今回の「2.5」の場合、端数が0.5だったので、奇数の3ではなく偶数の2のほうに丸められて処理された、というわけです。
これ、、、知らないと絶対ハマると思いませんか?というか、私はハマりました。
Excelでちまちま手で関数入力するのが嫌になり、ちょっとVBAでマクロ化してやろーと思ってやったら結果に違いが出て、なんで!?!?ってなったわけです。
結構バラつきのあるROUND関数
同じExcelでもROUND関数が四捨五入と偶数丸めの2つがあることがわかりましたが、Excel以外のアプリケーションや言語も結構ばらついているんですね。
上記サイトによると、
四捨五入
Java、Oracle、PostgreSQL、SQL Server、Excel
偶数丸め(銀行丸め)
C、Delphi、C#、VBA、MySQL
…ってな感じだそうです。
IT系のお仕事をしている人は意識して使い分けないと思わぬトラブルにつながっちゃうかもしれませんよ!?
まとめ
というわけで、知ってる人は知っているけど知らない人は絶対知らないだろうRound関数の端数処理に関するお話でした。
実は私もこれを知らずにトラブルになりかけたので、ぜひ知っておいてほしいと思い記事にしました。注意しましょうね。