レガシーは消えず

リタイアしたプログラマのコーヒータイム

四捨五入クラスを作ろう

四捨五入の計算にはwikiで調べるといろいろな方法があるのが分かります。業務システムでは0.4以下のときは切り捨て、0.5以上のときは切り上げるという一般的なものを多く使用します。小学校で習ったものと同じです。通常は
  124.4 ---> 124
  124.5 ---> 125
となります。ところが
  124.4 ---> 124
  124.5 ---> 124 ※
となってしまう四捨五入もあったりします。※印の部分が通常の四捨五入と違いますが決して間違っているわけではありません。VBでは四捨五入用の関数(Math.Round)の引数(mode)にAwayFromZeroとToEvenがあり、中間点(0.5)の下に何もないときAwayFromZeroはゼロから遠い方へToEvenは近い偶数に丸められます。

Dim dec1 As Decimal = 124.5@
Dim dec2 As Decimal = Math.Round(Dec1, 0, MidpointRounding.AwayFromZero)
Dim dec3 As Decimal = Math.Round(Dec1, 0, MidpointRounding.ToEven)
Console.WriteLine("{0}, {1}, {2}", dec1, dec2, dec3)   '-->124.5, 125, 124 

このことを知っていないと消費税の計算でバグが出たりします。ちょっとしたことですが仕様の確認を怠るとえらい目にあいます。こういうものはシステムで使用する四捨五入関数をクラスで定義しておくと間違うことが無くなります。

Public Function Round(Dec As Decimal) As Decimal
   Return Math.Round(Dec, 0, mode:=MidpointRounding.AwayFromZero)
End Function

こうした関数を集めた汎用クラス(dll)の使用を強制することで事故が防げます。