四捨五入する

 Accessには数値の丸めに用いる関数としてRound関数があります。一般的な四捨五入(以下、単に「四捨五入」といいます)とほぼ同じなのですが、例えば「Round(4.5)」の戻り値は5ではなく4となります。四捨五入であれば「○.5」という数値は切り上げるところですが、Round関数ではこの「○.5」という数値に対し、戻り値が偶数になるよう丸める(偶数丸め)という決まりがあるためこのような結果となります(詳しくはRound関数の記事をご覧ください)。
 そこでまず通常の四捨五入を実現するもっとも簡単な例として、Int関数を使って小数点以下を四捨五入するケースを紹介します。
 また、さらに特定の桁で四捨五入するケースについて、Int関数だけでなくその他の関数による四捨五入を行い、比較してみます。

Int関数により小数点以下第1位を四捨五入する(例:2.5→3)

f:id:accs2014:20170723210119p:plain:right:w300

 数値例として右のようなテーブルを用います。なお、データ型が結果にすることを避けるためデータ型は通貨型としています。
 四捨五入の対象とするのは「数値」列ですが、この後の四捨五入の計算結果と比較するための「本来の四捨五入値」列も設けています。


f:id:accs2014:20170723210116p:plain:right:w550

 さて、クエリデザインで次のような列を設けます。



Round関数: Round([数値])
Int関数: Int([数値]+0.5)

 上記のようにRound関数は偶数丸めとなり通常の四捨五入ではありませんが、比較のために置いています。
 そして、四捨五入を実現するのは後者のInt関数の方です。ただし、数値をそのまま引数にするのではなく、数値を0.5を足したものを引数とします。つまり「0.5を足してから小数点未満を切り捨てる」ことにより四捨五入を実現するというわけです。

f:id:accs2014:20170723210113p:plain:right:w400

 データシートビューです。
 Round関数の方は0.5などの数値に対し四捨五入と異なる結果になってますが、Int関数の方は四捨五入ができていることがわかります。


小数点以下第1位を四捨五入するさまざまな例(例:2.5→3)

f:id:accs2014:20170723210119p:plain:right:w300

 ここではInt関数以外でも四捨五入を実現する例を示してみます。
 数値例として、上記例と同じく右のようなテーブルを用います。なお、データ型が結果にすることを避けるためデータ型は通貨型としています。
 また、四捨五入の対象とするのは「数値」列ですが、この後の四捨五入の計算結果と比較するための「本来の四捨五入値」列も設けています。


 画像は省略しますがクエリで次のような列を設けます。

Round関数: Round([数値])
Int関数: Int([数値]+0.5)
Fix関数: Fix([数値]+0.5)
Format関数: Format([数値],"#,##0")
FormatNumber関数: FormatNumber([数値],0)

 Round関数は偶数丸めとなりますが、その他の4つの列はいずれも四捨五入を実現します。
 Format関数及びFormatNumber関数は文字列への変換となりますが、その過程で「0.5を足す」ということをしなくとも良いのがポイントです。

f:id:accs2014:20170723210110p:plain:right:w550

 データシートビューです。


小数点以下第3位を四捨五入するさまざまな例(例:0.025→0.03)

f:id:accs2014:20170723210107p:plain:right:w250

 小数点以下第2位、あるいはそれ以下の桁で四捨五入を行いたいという場合もありますので、ここではその例を示します。
 数値例として右のようなテーブルを用います。なお、データ型が結果にすることを避けるためデータ型は通貨型としています。


 画像は省略しますがクエリで次のような列を設けます。

Round関数: Round([数値]*100)/100
Int関数: Int([数値]*100+0.5)/100
Fix関数: Fix([数値]*100+0.5)/100
Format関数: Format([数値]*100,"0")/100
FormatNumber関数: FormatNumber([数値],2)

 Round関数は偶数丸めとなりますが、その他の4つの列はいずれも四捨五入を実現します。
 数値を引数とするときに100をかけておき、四捨五入を行った後で100で割る、という操作を加えることにより通常の四捨五入より2桁下での四捨五入を実現しています。ただしFormatNumber関数の場合は桁指定ができますのでその必要がありません。

(※Roundでも桁指定が可能でした。近いうちに訂正します)

f:id:accs2014:20170723210209p:plain:right:w550

 データシートビューです。


十の桁を四捨五入するさまざまな例(例:250→300)

 一の桁、あるいはそれ以上の桁で四捨五入を行いたいという場合もありますので、ここではその例を示します。
 数値例として右のようなテーブルを用います。なお、データ型が結果にすることを避けるためデータ型は通貨型としています。

f:id:accs2014:20170723210206p:plain:right:w250


 画像は省略しますがクエリで次のような列を設けます。

Round関数: Round([数値]/100)*100
Int関数: Int([数値]/100+0.5)*100
Fix関数: Fix([数値]/100+0.5)*100
Format関数: Format([数値]/100,"0")*100
FormatNumber関数: FormatNumber([数値]/100,0)*100

 Round関数は偶数丸めとなりますが、その他の4つの列はいずれも四捨五入を実現します。
 数値を引数とするときに100で割っておき、四捨五入を行った後で100をかける、という操作を加えることにより通常の四捨五入より2桁上での四捨五入を実現しています。FormatNumber関数の場合でもこの操作を行う必要があります(桁指定は1の桁か小数点以下の桁しか指定できないため)。

f:id:accs2014:20170723210201p:plain:right:w550

 データシートビューです。


データ型の影響について

f:id:accs2014:20170723210158p:plain:right:w250

 さて、これまで通貨型の値を対象として四捨五入の例を見てきましたが、その他のデータ型の場合において結果が変わってしまう例を見てみます。
 例として右のようなテーブルを用います。値は上記の3つ目の例と同じですが、データ型は単精度浮動小数点型としています。
 このテーブルを用いて、小数点以下第3位を四捨五入する例をみてみます。


 画像は省略しますがクエリで次のような列を設けます。いずれも3つ目の例と同じです。

Round関数: Round([数値]*100)/100
Int関数: Int([数値]*100+0.5)/100
Fix関数: Fix([数値]*100+0.5)/100
Format関数: Format([数値]*100,"0")/100
FormatNumber関数: FormatNumber([数値],2)

f:id:accs2014:20170723210155p:plain:right:w550

 データシートビューです。
 Round関数の結果が偶数丸めといえないものになっているほか、Int,Fix,Formatの各関数で0.005と0.015に対する結果が変わってしまっていることがわかります。100をかけたり割ったりしなくともよいFormatNumber関数については結果に変わりはなく、四捨五入が行われています。
 正確な四捨五入を行いたい場合にはこの点を考慮しなければならず、CCur関数で通貨型に変換しておくなどの対策が必要となります。

(※Roundでも桁指定が可能でした。近いうちに訂正します)


 四捨五入については以上ですが、意外なことにFormatNumber関数が優秀という印象です;-o-)