2017年9月9日

【Access】VBAで四捨五入



VBAで四捨五入するときは注意が必要です。

安易にROUND関数を使うと思わぬ結果を招くことがあります。

たとえば、6.5をROUND関数で四捨五入するといくつになると思いますか?

普通に考えると「7」になるんじゃないかと思いますが、結果は「6」になります。

これはどういうことかというと、VBAのROUND関数は「偶数丸め」といって対象の数値が「XX.5」の場合、四捨五入した結果が偶数になるように切り上げ切り捨てを行っているのです。

たとえば、下記の数値は次のよう丸められます。

ROUND関数丸め結果
数値結果
0.50
1.52
2.52
3.54
4.54
5.56
6.56
7.58

なぜこのようなことをするかというと、通常の四捨五入で丸めた「XX.5」の数字が多いと誤差を大きくなってしまうからです。ですので、お金にシビアな銀行では昔からこのやり方が行われてきたようです。(端数処理 - Wikipedia


それでは、VBAで通常の四捨五入をするにはどうればいいのか?

答えは簡単です。

対象の数字に0.5を足して切り捨てればいいのです。

Public Function RoundX(ByVal data As Double) As Long

    Dim rtn As Long
    
    rtn = Int(data + 0.5)
    
    RoundX = rtn
    
End Function

試しにイミディエイトウィンドウで実行してみるとこのようになります。
?RoundX(6.5)
 7 


ただ、これだと整数に丸める場合にしか使えません。

そこで、指定の桁数に丸められるように次のように改造してみました。
Public Function RoundX2(ByVal data As Double, ByVal digit As Integer) As Double

    Dim rtn As Double
    Dim dt As Double
    Dim weight As Double
    
    weight = 10 ^ digit
    
    dt = data * weight
    
    rtn = Int(dt + 0.5) / weight
    
    RoundX2 = rtn
    
End Function
指定の桁数分小数点を移動してから0.5を足して切り捨て、そして、その値を重みで割って小数点をもとに戻してあげています。

実行するとこのようになります。
?RoundX2(2.665, 2)
 2.67 



スポンサーリンク