3/27/2018

Access。クエリで四捨五入するにRound関数ではダメなんです。【Round】

Access。クエリで四捨五入するにRound関数ではダメなんです。

<Round関数・Int関数>

四捨五入。Excelでもおなじみの処理で、ROUND関数を使えば、
簡単に四捨五入した数値を算出することができますよね。

AccessにもExcelと同じように、Round関数というのがありまして、
四捨五入をしてくれるのですが、あることを知らないと、
とんでもない落とし穴があって、
Excelで算出したものと数値が異なってしまうのです。

次のテーブルがあります。

デザインビューで確認すると次のようなテーブルです。

このテーブルの数値の小数点第1位を四捨五入しますので、
次のようなクエリを作っていきます。

フィールドに、NOと数値の各フィールドを設定して、
四捨五入をするので、Round関数を使って算出しますので、
演算フィールドを作成します。

四捨五入Round: Round([数値])

Excelと同じような感じですね。
では、保存して、データシートビューに切り替えてみましょう。

問題なく算出されたようにも見えますが、
よく見てみると、おかしなところがあります。

それは、2.5が2になっていますよね。

4.5も4。四捨五入なので、2.5は3。4.5は5になっていないといけないはず。

しかし、1.5は2。3.5は4というように、
こちらはおなじみの四捨五入になっていますよね。

これ、偶数と奇数で四捨五入の処理が違うのです。

この四捨五入、壊れているわけでも、間違っているわけでもないのです。

そして、ここがExcelのROUND関数とAccessのRound関数の違いなのです。

だから知らないと、
この結果をExcelにエクスポートして使うと誤差が生じてしまうのです。

なんでこんなことが起こっているのかというと、
AccessのRound関数は、
JIS式の丸め処理(銀行型の丸め処理と呼ばれたりもします)を行っているのです。

これは、四捨五入の欠点を補うためのものなのですが、
四捨五入というのは、
どうしても数値が大きいほうに偏ってしまう傾向にあるのです。

要するに、1~9の数値のうち、
四捨にあたる1~4は、1・2・3・4と4つ数値が該当して、
五入にあたるのが、5~9で、5・6・7・8・9と5つの数値が該当しています。

そのため、どうしても、該当数が多い五入のほうに偏ってしまうわけです。

そこで、偏りを抑制するために、奇数と偶数に分けて、
真ん中の5を切り捨てる場合と、切り上げる場合を半分ずつにしたのが、
このJIS式の丸め処理なのです。

これをAccessのRound関数は採用しているわけですね。

では、どのようにしたら、
Excelと同じような四捨五入を行うことができるのでしょうか?

次のような演算フィールドを作成してみましょう。

演算フィールドは、四捨五入Int関数: Int([数値]+0.5)

では、結果を見てみましょう。

2.5は3。4.5も5と算出されていますよね。

このように、ExcelのROUND関数と同じ結果を求める場合には、
Int関数を使う必要があるのです。

Int([数値]+0.5)を説明すると、
2.4+0.5ならば2.9なので整数化するInt関数を使えば、2と算出されて、
2.5+0.5ならば、3なので、3と算出されるわけです。

さて、小数点第1位を四捨五入しているわけですが、
小数点第2位を四捨五入したい場合はどうしたらいいのでしょうか?

Excelでは、ROUND関数で引数に、1とか使えばいいのですが、
Round関数は使えませんので、次のような演算フィールドで対応します。

四捨五入Int関数02: Int([数値]*10+0.5)/10

10倍して+0.5して整数化して、10で除算してもとに戻すという数式ですね。

また、Round関数の演算フィールドに引数を追加しています。

これは、Round関数ではダメなことを確認するためです。

それと、数値フィールドに>4という抽出条件を加えていますが、
これは、データを見やすくするためのものですので、本来は不要です。

では確認してみましょう。

4.65は4.7に、4.75は4.8になっていますよね。

このように、Accessにも四捨五入を行う、Round関数というのがありますが、
Excelとちょっと異なる動きをしますので、ご注意のほど。