Accessで小数データを処理する際に、小数点以下を切り捨て・四捨五入・切り上げすることがあります。
ExcelではそれぞれROUNDDOWN関数、ROUND関数、ROUNDUP関数があり、簡単に処理をしてくれますが、Accessにはこれらに相当する関数がありません。このため、「INT関数」を活用し数値処理をする必要がありますので、今回はその方法を紹介したいと思います。
サンプルデータ
サンプルデータ作成に当たり「数値テーブル」を作成し、一つのフィールドを作成します。フィールド名は「数値」、データ型は「数値型」、フィールドサイズは「倍精度浮動小数点型」とします。そして、次のデータを入力しておきます。
■サンプルデータ
数値 |
1.23 |
1.37 |
1.52 |
1.78 |
今回は、小数第1位及び小数第2位に対してその処理方法を見ていきましょう。
INT関数
小数以下の処理をする際に用いる関数として、「INT関数」があります。
Int(数値)
INT 関数の書式には、次の引数があります。
INT関数は、指定された数値を最も近い整数に切り捨てる処理をします。したがって、例えばINT(1.89)の場合は「1」が結果として返されます。
切り捨て処理
小数点以下の処理としてまずは「切り捨て」について考えてみましょう。「INT関数」それ自体が小数第1位の切り捨てをします。したがって、上記のように「1.89」を引数としてINT関数に与えることで、「1」が返ってきます。
さて、小数第2位以下で切り捨てをしたい場合はどうすれば良いでしょうか?これは、INT関数に与える引数を桁単位で乗じて処理をし、その後に改めて桁単位で除する方法があります。
具体的な例として、「1.89」を小数第2位で切り捨てる場合は、「INT(1.89*10)/10」とします。この式の処理を順番に考えていきます。
① 1.89*10 = 18.9
② INT(18.9) = 18・・・INT関数で小数点以下を切り捨て
③ 18/10 = 1.8
いかがでしょうか?上のプロセスのように、小数第N位で切り捨てをしたい場合は、次のように表記することができます。
INT(数値*10N-1)/10N-1
四捨五入処理
次に、小数点以下の処理として「四捨五入」について考えてみましょう。まずは、小数第1位に対する四捨五入を考えます。「INT関数」はそれ自体が小数第1位の切り捨てをします。そこで、対象となる数値に「0.5」を足した後、INT関数を適用します。すると、小数第1位の値が0.1~0.4のものについては繰り上がりされず、整数値に変化はありませんが小数第1位の値が0.5~0.9のものについては繰り上がりして整数値が1つ増えます。このため、INT関数を用いると小数第1位で四捨五入した結果が得られることになります。
これらを踏まえて先ほどと同じように、「1.89」を使って四捨五入の処理をするには、「INT(1.89+0.5)」と記載します。
① 1.89+0.5 = 2.39
② INT(2.39) = 2・・・小数第1位で四捨五入した値に一致
さて、小数第2位以下で四捨五入をしたい場合はどうすれば良いでしょうか?これも切り捨て処理と基本は同様です。INT関数に与える引数を桁単位で乗じた後に0.5を足して処理をし、その後に改めて桁単位で除する方法です。
具体的な例として、「1.89」を小数第2位で四捨五入場合は、「INT(1.89*10+0.5)/10」とします。この式の処理を順番に考えていきます。
① 1.89*10 = 18.9
② 18.9+0.5 = 19.4
② INT(19.4) = 19・・・INT関数で小数点以下を切り捨て
③ 19/10 = 1.9
いかがでしょうか?上のプロセスのように、小数第N位で四捨五入をしたい場合は、次のように表記することができます。
INT(数値*10N-1+0.5)/10N-1
切り上げ処理
最後に切り上げ処理を見ていきます。これは先に紹介した四捨五入とほぼ同じ考え方が適用でき、「0.5」の代わりに「0.9」を用います。
まずは、小数第1位に対する切り上げを考えます。「INT関数」はそれ自体が小数第1位の切り捨てをします。そこで、対象となる数値に「0.9」を足した後、INT関数を適用します。すると、小数第1位の値が繰り上がり整数値が1つ増え、INT関数により小数第1位で切り上げした結果が得られることになります。
これらを踏まえて先ほどと同じように、「1.23」を使って切り上げの処理をするには、「INT(1.23+0.9)」と記載します。
① 1.23+0.9 = 2.13
② INT(2.13) = 2・・・小数第1位で切り上げした値に一致
さて、小数第2位以下で切り上げをしたい場合はどうすれば良いでしょうか?これも四捨五入処理と同様で、INT関数に与える引数を桁単位で乗じた後に0.9を足して処理をし、その後に改めて桁単位で除する方法です。
「1.23」を小数第2位で切り上げする場合は、「INT(1.23*10+0.9)/10」とします。この式の処理を順番に考えていきます。
① 1.23*10 = 12.3
② 12.3+0.9 = 13.2
② INT(13.2) = 13・・・INT関数で小数点以下を切り捨て
③ 13/10 = 1.3
いかがでしょうか?上のプロセスのように、小数第N位で切り上げをしたい場合は、次のように表記することができます。
INT(数値*10N-1+0.9)/10N-1
クエリによる結果確認
これまでの内容をサンプルデータを用いて実際に処理をしてみます。
図1に示すように「数値テーブル」の各値に対して小数第1位及び小数第2位に対して、切り捨て、四捨五入、切り上げ処理をするクエリを作成しました。
クエリの各フィールドは次のようにしています。
・数値
・小数第1位切り捨て: Int([数値])
・小数第2位切り捨て: Int([数値]*10)/10
・小数第1位で四捨五入: Int([数値]+0.5)
・小数第2位で四捨五入: Int([数値]*10+0.5)/10
・小数第1位で切り上げ: Int([数値]+0.9)
・小数第2位で切り上げ: Int([数値]*10+0.9)/10
このようにクエリを作成し結果を確認したものが図2になります。
まとめ
今回はAccessによる小数の処理方法について紹介をしました。Excelと違って、INT関数を活用することで小数の処理を実現しました。
この方法はExcelに慣れていると意外と気づきにくいものですが、一度処理方法を覚えてしまえば、様々な場面で活用できると思いますので、この機会に是非覚えていただければと思います。
スポンサーリンク
コメント
こんにちは。こちらの記事を参考にさせていただき、「切り上げ処理」をしていました。ところが、小数点第1位が0の場合は切り捨てになってしまいます。(例)Int(1.02+0.9)=1
IIf(Int(データ)=データ,データ,Int(データ+1))という式を他で見つけ、これなら解決かと思ったのですが、元データを通貨型にして誤差が出ないようにしても、見た目には整数のものが+1されてしまいます。
何かいい方法はないでしょうか。
こんにちは、HPをご覧いただきありがとうございます。ご指摘のとおり、小数第1位は0で、第2位に数字がある場合に当HPで紹介している方法では処理できませんので、IIfによる分岐処理が必要ですね。
さて、通貨型にしても同様の処理がされるということですが、例えば「1.2」という値を持たせたとき、見かけ上は「¥1」となりますがテーブルが保持している値は「1.2」のままであるため、切り上げ処理がされます。
何かいい方法は?、ということですが、具体的にどのような処理をされたいのでしょうか?
Int(1.02+0.9)=1→int(1.02+0.99)=2
単純な繰り上げをしたい場合小数点以下が多ければ大体において問題は無いかと思います。
ご意見をありがとうございました。
複雑な条件を盛り込む場合はVBAで処理してしまうのも手かもしれませんね。