A Day In The Life

とあるプログラマの備忘録

.NETで四捨五入

Math.Roundメソッドを使うと四捨五入ができると思いきやできません。

.NETで四捨五入用のメソッドは今のところないようです(ていうかVB6の時からなかったような)。

Math.Roundメソッドはいったい何をしてくれているかというと近似値へのまるめを行ってくれます。

Math.Round(4.4) 'Returns 4.0.
Math.Round(4.5) 'Returns 4.0.
Math.Round(4.6) 'Returns 5.0.

四捨五入よりも近似値へのまるめの方が値は正確なようです。
でもどうしても四捨五入じゃなきゃダメって時は自分で関数を作るしかないようです。
いろいろ調べていると@IT会議室で熱い議論を発見!

で読んでみた結果

Integer x = 2367896
Integer y = x + 5
Integer z = y - (y mod 10)

ってのがよさそうだと思いました。

これを元に小数点以下の場合はどうするとか負の数の場合はどうするってのを考慮に入れて作っていけば良いのかなと。。。

あと記憶ベースですが.NETでデータグリッドを使うのであればexpression句で四捨五入ができたような気がします。
というか指定した桁を超えると勝手に四捨五入をしてくれたはずです。
ちなみにJAVAの場合は

BigDecimal dec = new BigDecimal("0.5");
System.out.println(dec.divide(new BigDecimal(1), 0,BigDecimal.ROUND_HALF_UP));

でできるようです。

たかが四捨五入と思いきやあなどれませんね(^_^;)

共通していえるのはIntegerやLongなどの整数型なら問題ないのですが浮動小数点系の型の場合は気をつけないといけませんね。

できればDecimalなどの浮動小数点系以外の型を使ったほうが良いでしょう。