.NET 小数点以下を四捨五入する

C#、VB.NETで小数点以下を四捨五入する場合は「Math.Round」メソッドを使いますが、通常の四捨五入と異なる動きをする場合があります。
 
論より証拠。以下の値に「2.5」を入力し実行ボタンをクリックすると、実行結果に「2.0」と表示されます。
 
Math.Round( 
 ); 
実行結果:
 
 
これは「最近接偶数への丸め」や「銀行家の丸め」と呼ばれ、端数が「0.5」のときに結果が偶数になるような丸め方をするためです。
 
なぜこのような複雑な仕様なのでしょうか?
 
通常の四捨五入の場合、切り捨てられる端数が「1、2、3、4」の4個なのに対し、切り上げられる端数が「5、6、7、8、9」の5個と切り上げられる確率のほうが高いため、丸めた値をたくさん足すと誤差が大きくなってしまいます。
 
そこで「0.5」を常に偶数になるように丸めると、「1.5」が「2.0」、「2.5」が「2.0」と切り上げと切り捨てが等しい確率で発生するため、丸めた値をたくさん足した場合も誤差が少なくなるのです。
 
IEEE 754でも定められている通り、浮動小数点数の丸め方としては通常の四捨五入よりも一般的ではあるのですが、私は普通の四捨五入がしたいんです!
 
その場合は「Math.Round」メソッドの引数に「MidpointRounding.AwayFromZero」を指定します。
 
Math.Round( 
 , 
 );
実行結果:
 
 
Math.Round」メソッドの引数に「MidpointRounding.AwayFromZero」を指定すると「2.5」を「3.0」へ四捨五入してくれます。「銀行家の丸め」をしたい場合は「MidpointRounding.ToEven」を指定します。
 
もちろん小数部を指定の桁数で四捨五入することも可能です。
 
Math.Round( 
 , 
 , 
 ); 
実行結果:
 

g h T
 7,072 Total Views

ADVERTISING

駅チカ!ホテル検索
全国の駅や目的地近くの宿泊施設を検索し予約することができます。最寄駅沿線からもホテルを検索できるので、アクセスのよいホテルを予約することが可能です。
  1. コメントはまだありません。

  1. トラックバックはまだありません。