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とちょっと異なる動きをしますので、ご注意のほど。