VBAで四捨五入するときは注意が必要です。
安易にROUND関数を使うと思わぬ結果を招くことがあります。
たとえば、6.5をROUND関数で四捨五入するといくつになると思いますか?
普通に考えると「7」になるんじゃないかと思いますが、結果は「6」になります。
これはどういうことかというと、VBAのROUND関数は「偶数丸め」といって対象の数値が「XX.5」の場合、四捨五入した結果が偶数になるように切り上げ切り捨てを行っているのです。
たとえば、下記の数値は次のよう丸められます。
ROUND関数丸め結果
数値 | 結果 |
---|---|
0.5 | 0 |
1.5 | 2 |
2.5 | 2 |
3.5 | 4 |
4.5 | 4 |
5.5 | 6 |
6.5 | 6 |
7.5 | 8 |
なぜこのようなことをするかというと、通常の四捨五入で丸めた「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
スポンサーリンク