素朴な疑問 | Server OS Cafe

Server OS Cafe

Server OSの紹介等

今日、仕事中に引っかかったこと。Microsoft Visual BasicのCLng関数の端数処理(小数点以下の丸め)の仕様。
実は小数点第一位が5の場合、最も近い偶数倍にまとめられます。
参考:http://msdn.microsoft.com/ja-jp/library/cc410213.aspx

(例)
CLng(131.5) ⇒ 132
CLng(132.5) ⇒ 132
※.NET Frameworkの標準クラスではSystem.Math.Roundも同じ動きをしますね

ね、不思議でしょう。
何でだろうと思ってよく調べてみたら、これは「JIS Z 8401-1999」規則Aによって定められている数値の丸め方なのです。(元々はISO-31によって定められている物をJISが日本向けに定義したもの)

参考:http://kikakurui.com/z8/Z8401-1999-01.html

まあ簡単に言うと、四捨五入(JIS Z 8401-1999の規則B)だと、1、2、3、4が切り捨てで、5、6、7、8、9が切り上げとなり、切り上げられる数値の方が多い為、累積すると誤差が拡大してしまうので、5の場合に切り捨て、切り上げの両方を行って、偏らないようにしているのです。
正式には「最近接偶数への丸め」と言うそうですが、銀行がよく使う方法なので「銀行丸め」とも言われるそうです。
ちなみにJavaのSystem.Math.Roundは四捨五入です。
Microsoftは時々変わったことをしますよね。