タグ : 四捨五入

 

.NET 文字列を整数に変換する(小数点以下を四捨五入)

C#、VB.NETでString型の文字列をint型の整数に変換する際、小数点以下を四捨五入するメソッドを作成しました。
 
以前ご紹介した「.NET 小数点以下を四捨五入する」を用いて、文字列以外にもfloat型、double型などからの変換にも対応しております。
 
●文字列を整数に変換する(小数点以下を四捨五入)
        /// <summary>
        /// 値を四捨五入し、指定の桁数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <param name="decimals">小数部桁数</param>
        /// <param name="mode">丸める方法</param>
        /// <returns>丸められた値</returns>
        public static double Round(double value, int decimals, MidpointRounding mode)
        {
            // 小数部桁数の10の累乗を取得
            double pow = Math.Pow(10, decimals);

            return Math.Round(value * pow, mode) / pow;
        }

        /// <summary>
        /// 値を四捨五入し、指定の桁数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <param name="decimals">小数部桁数</param>
        /// <param name="mode">丸める方法</param>
        /// <returns>丸められた値</returns>
        public static double Round(object value, int decimals, MidpointRounding mode)
        {
            return Round(Convert.ToDouble(value), decimals, mode);
        }

        /// <summary>
        /// 値の小数点以下を四捨五入し、整数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <param name="mode">丸める方法</param>
        /// <returns>丸められた値</returns>
        public static int Round(object value, MidpointRounding mode)
        {
            return Convert.ToInt32(Round(value, 0, mode));
        }

        /// <summary>
        /// 値の小数点以下を四捨五入し、整数に丸めます
        /// </summary>
        /// <remarks>数値が2つの数値の中間に位置する場合、ゼロから遠いほうの近似値に丸めます</remarks>
        /// <param name="value"></param>
        /// <returns>丸められた値</returns>
        public static int Round(object value)
        {
            return Round(value, MidpointRounding.AwayFromZero);
        }
 
 
Clipボタンをクリックすると、「ConvertUtility」というクラスがコピーされます。このソースを「ConvertUtility.cs」ファイルにコピーするとすぐご利用いただけます。
 
上記Roundメソッドは、一般的な四捨五入(1.5 ⇒ 2、2.5 ⇒ 3のように数値が2つの数値の中間に位置する場合、ゼロから遠いほうの近似値に丸める)を行います。
 
このページでは、上記Roundメソッドを実際に動かした時の挙動を確認できます。
 
ConvertUtility.Round(" 
 "); 
実行結果:
 
 

.NET 整数を四捨五入する

C#、VB.NETで整数を四捨五入する場合は、「Math.Round」メソッドを使ってメソッドを自作する必要があります。
 
        /// <summary>
        /// 値を四捨五入します
        /// </summary>
        /// <param name="value"></param>
        /// <param name="decimals">小数部桁数</param>
        /// <param name="mode">丸める方法</param>
        /// <returns>丸められた値</returns>
        private double Round(double value, int decimals,
            MidpointRounding mode)
        {
            // 小数部桁数の10の累乗を取得
            double pow = Math.Pow(10, decimals);

            return Math.Round(value * pow, mode) / pow;
        }
 
 
このページでは、上記Roundメソッドを実際に動かした時の挙動を確認できます。
 
小数部桁数に「-3」を指定すると100の位を四捨五入します。「1500」⇒「2000」という動きになり、ExcelのRoundメソッドと同じ動作をします。もちろん通常通り小数点以下を四捨五入することもできます。
 
Round( 
 , 
 , 
 ); 
実行結果:
 
 

.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,817 Total Views