数値を四捨五入するには

[Access 2016/2013/2010/2007]

Accessには四捨五入を行うための関数がないので、数値を四捨五入するにはちょっとした工夫が必要です。負数の四捨五入をどのように考えるかによって、2種類の式を紹介します。

なお、ここでは通貨型のフィールドの数値を四捨五入することを前提に話を進めます。倍精度浮動小数点型や単精度浮動小数点型では、小数の計算に誤差が出ることがあります。記事の最後の「データ型による注意点」もお読みください。

スポンサーリンク

2種類の四捨五入

数値を四捨五入するときは、負数の「.5」をどのように処理するのかによって、Int関数とFix関数を使い分けます。

■常に数値が大きくなるように四捨五入する → Int関数を使用
「-1.5」を「-1」「-0.5」を「0」、「0.5」を「1」、「1.5」を「2」というように、「.5」を常に数値が大きくなるように処理するには、「Int関数を使用して数値を四捨五入する」を参照してください。

■数値の絶対値が大きくなるように四捨五入する → Fix関数を使用
「-1.5」を「-2」「-0.5」を「-1」、「0.5」を「1」、「1.5」を「2」というように、「.5」を数値の絶対値が大きくなるように処理するには、「Fix関数を使用して数値を四捨五入する」を参照してください。

一般的な四捨五入は後者の方法ですが、四捨五入の対象が正数に限られるならどちらの式を使用しても結果が同じなので、式が簡単な前者の方法が理解しやすいと思います。

メモ

Round関数では銀行型の丸め処理になる
AccessのRound関数は、銀行型の丸め処理(JIS式の丸め処理)を行います。一般的な四捨五入とは異なる結果になるので注意してください。銀行型の丸め処理については、Round関数のページを参照してください。

(基礎知識)Int関数とFix関数

まずは、数値の四捨五入に使用するInt関数構文1)とFix関数構文2)を理解しておきましょう。「そんなの知ってる!」という方は、読み飛ばしてください。

Int関数とFix関数は、いずれも数値の小数部分を切り捨てる関数です。引数の数値が正数の場合、どちらの関数も単純に数値の小数部分を削除した数値を返します。しかし、引数の数値が負数の場合、Int関数とFix関数の結果に差が出ます(図1図2)。Int関数では常に数値が小さくなるほうに向かって端数が処理されるのに対して、Fix関数では「0」に向かって端数が処理されます。端数を切り捨てて数値の値自体を小さくしたい場合にはInt関数、数値の絶対値を小さくしたい場合はFix関数、と使い分けます。

構文1 数値以下の最大の整数を求める
Int(数値)

構文2 数値の小数部分を取り除いた整数を求める
Fix(数値)

図1 Int関数では、常に数値が小さくなる方向に端数処理される。

図2 Fix関数では、「0」に向かって端数処理される。

Int関数を使用して数値を四捨五入する

数値を四捨五入するには、数値に「0.5」を加えてから小数部分を切り落とします。Int関数を使用して[数値]フィールドの数値を四捨五入する場合、式1のようになります。

式1 Int関数を使用して数値を四捨五入する
Int([数値]+0.5)

式1に数値を当てはめると、四捨五入の考え方がわかりやすくなります。

「1.4」の四捨五入 : Int(1.4+0.5) → Int(1.9) → 1
「1.5」の四捨五入 : Int(1.5+0.5) → Int(2.0) → 2
「1.6」の四捨五入 : Int(1.6+0.5) → Int(2.1) → 2

Int関数で四捨五入すると、「.5」は常に数値が大きくなるように処理されます(図3)。負数に関しては、「.5」が一般的な四捨五入とは異なる結果になるので注意してください。ただ、次項で説明するFix関数に比べて式が単純なので、処理対象が正数に限られるならこちらの方法のほうが簡単で理解しやすいでしょう。

「-1.4」の四捨五入 : Int(-1.4+0.5) → Int(-0.9) → -1
「-1.5」の四捨五入 : Int(-1.5+0.5) → Int(-1.0) → -1
「-1.6」の四捨五入 : Int(-1.6+0.5) → Int(-1.1) → -2

図3 「Int([数値]+0.5)」を使うと、数値の端数が「.5」の場合に、常に数値が大きくなる方向に端数処理される。

Fix関数を使用して数値を四捨五入する

一般的な四捨五入のとおり、「-1.5」を「-2」、「-0.5」を「-1」、「0.5」を「1」、「1.5」を「2」というように、数値の絶対値が大きくなる方向に端数処理したい場合は、Fix関数を使用します。その際、Sgn関数も併用して、正数の場合は「+0.5」、負数の場合は「-0.5」を数値に加えてから、Fix関数で端数処理するとうまくいきます。Sgn関数は、引数の数値が正の場合は「1」、「0」の場合は「0」、負の場合は「-1」を返す関数です。

構文3 数値の符号によって返す値を切り替える
Sgn(数値)

式2 Fix関数を使用して数値を四捨五入する
Fix([数値]+0.5*Sgn([数値]))

数値が正数の場合、計算結果はInt関数と同じになります。

「1.4」の四捨五入 : Fix(1.4+0.5) → Fix(1.9) → 1
「1.5」の四捨五入 : Fix(1.5+0.5) → Fix(2.0) → 2
「1.6」の四捨五入 : Fix(1.6+0.5) → Fix(2.1) → 2

数値が負数の場合、「.5」は常に数値の絶対値が大きくなるように処理されます(図4)。

「-1.4」の四捨五入 : Fix(-1.4-0.5) → Fix(-1.9) → -1
「-1.5」の四捨五入 : Fix(-1.5-0.5) → Fix(-2.0) → -2
「-1.6」の四捨五入 : Fix(-1.6-0.5) → Fix(-2.1) → -2

図4 「Fix([数値]+0.5*Sgn([数値]))」を使うと、数値の端数が「.5」の場合に、常に絶対値が大きくなる方向に端数処理される。

四捨五入する桁を指定するには

四捨五入を小数点第2位や小数点第3位で行いたい場合は、小数点の位置をずらして四捨五入をしてから、小数点の位置を戻します。例えば「1.24を1.2」、「1.25を1.3」というように小数点第2位を四捨五入したい場合は、数値を10倍して四捨五入してから10で割ります。

式3 小数点第2位を四捨五入する
Int([数値]*10+0.5)/10
Fix([数値]*10+0.5*Sgn([数値]))/10

「1.24」の四捨五入 : Int(1.24×10+0.5)÷10 → Int(12.9)÷10 → 1.2
「1.25」の四捨五入 : Int(1.25×10+0.5)÷10 → Int(13.0)÷10 → 1.3
「1.26」の四捨五入 : Int(1.26×10+0.5)÷10 → Int(13.1)÷10 → 1.3

また、「1.234を1.23」、「1.235を1.24」というように小数点第3位を四捨五入したい場合は、数値を100倍して四捨五入してから100で割ります。

式4 小数点第3位を四捨五入する 
Int([数値]*100+0.5)/100
Fix([数値]*100+0.5*Sgn([数値]))/100

同じ考え方で、10の位や100の位の数値を四捨五入することもできます。例えば「1234を1200」、「3456を3500」というように十の位を四捨五入するには、数値を100で割って四捨五入してから100倍します。「単価を切りよく100円単位で揃えたい」というようなときに便利です。 

式5 十の位を四捨五入する
Int([数値]/100+0.5)*100
Fix([数値]/100+0.5*Sgn([数値]))*100

「1234」の四捨五入 : Int(1234÷100+0.5)×100 → Int(12.84)×100 → 1200
「3456」の四捨五入 : Int(3456÷100+0.5)×100 → Int(35.06)×100 → 3500

Format関数を利用する裏ワザもあり

数値を四捨五入するには、Format関数を利用する手もあります(構文4、正式な構文はFormat関数のページを参照)。引数[書式]で処理対象の桁を指定できるので、正攻法のInt関数やFix関数による四捨五入より簡単かもしれませんね。ただし、Format関数の戻り値は文字列なので、適切な変換関数を使用して数値に戻しておくとよいでしょう。

構文4 データに書式を設定して返す
Format(データ, 書式)

例えば、「1.24を1.2」、「1.25を1.3」というように小数点第2位を四捨五入したい場合は、式6のように引数[書式]に「"0.0"」を指定します。式で使用しているVal関数は、引数のデータを数値に変換する関数です。使用する変換関数によっては、クエリのフィールドプロパティの[小数点以下表示桁数]を指定しないと小数点以下が隠れてしまうことがあるので注意してください。

式6 Format関数を使用して数値を四捨五入する
Val(Format([数値],"0.0"))

図5は、式3のInt関数とFix関数、式6のFormat関数による四捨五入の検証結果です。負数の「.5」の挙動に注目すると、Format関数はFix関数と同じ結果になるようです。

図5 「Int([数値]*10+0.5)/10」「Fix([数値]*10+0.5*Sgn([数値]))/10」「Val(Format([数値],"0.0"))」の検証結果。

データ型による注意点

倍精度浮動小数点型や単精度浮動小数点型の小数の計算では、計算を繰り返す過程で誤差が出ることがあります。正確な計算を行いたい場合は、テーブルでそもそものフィールド型を通貨型にしておくか、CCur関数を使用してデータを通貨型に変換してから四捨五入するなどの対策が必要です。

通貨型では、小数点以下4桁の数値を扱えます。テーブルで通貨型を設定すると数値に「¥」記号が表示されますが、[書式]プロパティで[数値]を選ぶなどの対処をすれば「¥」を外せます。また、通貨型のフィールドに小数を入力しても初期設定では小数点以下が非表示になりますが、[小数点以下表示桁数]プロパティに桁数を指定すれば表示できます。

なお、対象の数値が浮動小数点型の場合でも、Format関数による四捨五入なら足したり掛けたり割ったりの計算を繰り返さないので、誤差が出にくいのではないかと感じています。

スポンサーリンク

関連記事