VBA(へたれな)コネタ 五捨五入

久しぶりの技術ねた。マネージメントや分析系ばかりでコアなテクノロジから離れていたのでコネタすらない状態です。そんな中、社内グループウェアであがった話題をここで紹介します。このネタは10年くらい前にやはり、社内のグループウェアに投稿した話題なのですが、グループウェアが違うものに変わり、当時の知識も薄れていたところに、同じようなネタの話題が社内に上がってきたのでした。この手のネタはある程度自分自身で苦しまないといけないのかもしれませんね。

VBにおいて(ACCESSのVBA含む)数値の丸めについて注意点を整理

従来VBにおいて丸めは「CInt」などの関数を使用しますがみなさんはこの関数の基本仕様をご存知でしょうか?この関数は引数で与えられた数値を整数に変換するものですが
 「1.5」の結果は、「2」
 「2.5」の結果は、「2」
 「3.5」の結果は、「4」
となります。
余り意識していないかもしれませんが、いわゆる丸めというと特に日本の事務処理においてはほとんど四捨五入でしょう。しかし、この関数の仕様は違います。切り捨てでも切り上げでも有りません。あえていうなら「五捨五入」とでもいうのでしょうか。正確なアルゴリズムは一番近い偶数になるということです。これが、VB上における丸めの基本です。
ちなみにこれはJISで決められている丸め方法です。この丸め方丸め後の数値を累積していった場合の誤差が少なくなるのです。計測値などの数値を累計したりする場合にはこちらの方が誤差が少なくなるのでこちらの方が向いているのです。

VB6においてRound関数が導入されましたがこの関数の言うところの丸めももちろん「五捨五入」です。ですから四捨五入処理は従来どうり下記の処理でお願いします。
=============================================================

四捨五入したい値に0.5を加算して少数値を切り捨てる。マイナス値の扱いに注意

Public Function RoundB(varNum As Variant) As Variant
    RoundB = Fix(varNum + Sgn(varNum) * 0.5)
End Function

注意:
VBのround関数は五捨五入であるので使用できない。
EXCELのVBAのRound関数は五捨五入であるので使用できない。
AccessのRound関数は五捨五入であるので使用できない。

T-SQLのRound関数はOK
EXCELのワークシートのRound関数はOK