タグ : 小数点

 

.NET 文字列を整数に変換する(小数点以下を切り捨て)

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

            return 0 <= value ? Math.Floor(value * pow) / pow :
                Math.Ceiling(value * pow) / pow;
        }

        /// <summary>
        /// 値を切り捨て、指定の桁数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <param name="decimals">小数部桁数</param>
        /// <returns>丸められた値</returns>
        public static double Truncate(object value, int decimals)
        {
            return Truncate(Convert.ToDouble(value), decimals);
        }

        /// <summary>
        /// 値の小数点以下を切り捨て、整数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <returns>丸められた値</returns>
        public static int Truncate(object value)
        {
            return Convert.ToInt32(Truncate(value, 0));
        }
 
 
Clipボタンをクリックすると、「ConvertUtility」というクラスがコピーされます。このソースを「ConvertUtility.cs」ファイルにコピーするとすぐご利用いただけます。
 
上記Truncateメソッドは、符号を無視して絶対値を切り捨てる(常に0へ近づく)丸めになりますが、丸めの方法はシステムの要件によって異なりますので、プロジェクトの早い段階で検討することをおススメします。
 
このページでは、上記Truncateメソッドを実際に動かした時の挙動を確認できます。
 
ConvertUtility.Truncate(" 
 "); 
実行結果:
 
 

.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で文字列が小数を含む数値に変換できるかをチェックします。今回は正規表現を利用して符号なし数値、符号あり数値をチェックする方法をご紹介します。
 
●文字列が符号なし数値(小数を含む)であるかをチェック
        /// <summary>
        /// 文字列が符号なしの小数かどうかを判定します
        /// </summary>
        /// <param name="target">対象の文字列</param>
        /// <returns>文字列が符号なしの小数の場合はtrue、それ以外はfalse</returns>
        public static bool IsUnsignedDecimal(string target)
        {
            return new Regex("^[0-9]*\\.?[0-9]+$").IsMatch(target);
        }
 
 
●文字列が符号あり数値(小数を含む)であるかをチェック
        /// <summary>
        /// 文字列が符号ありの小数かどうかを判定します
        /// </summary>
        /// <param name="target">対象の文字列</param>
        /// <returns>文字列が符号ありの小数の場合はtrue、それ以外はfalse</returns>
        public static bool IsDecimal(string target)
        {
            return new Regex("^[-+]?[0-9]*\\.?[0-9]+$").IsMatch(target);
        }
 
 
以下のエリアでは「IsUnsignedDecimal」と「IsDecimal」メソッドを実際に動かした時の挙動を確認できます。
 
●文字列が符号なし数値(小数を含む)であるかをチェック
IsUnsignedDecimal(" 
 ");    
実行結果:
 
●文字列が符号あり数値(小数を含む)であるかをチェック
IsDecimal(" 
 ");                 
実行結果:
 

.NET 小数点以下を切り上げる

C#、VB.NETで小数点以下を切り上げる場合は「Math.Floor」と「Math.Ceiling」メソッドを組み合わせ、用途に合わせてメソッドを自作する必要があります。
 
        /// <summary>
        /// 値の小数部を切り上げ、指定の桁数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <param name="decimals">小数部桁数</param>
        /// <returns>丸められた値</returns>
        private double RoundUp(double value, int decimals)
        {
            // 小数部桁数の10の累乗を取得
            double pow = Math.Pow(10, decimals);

            return 0 <= value ? Math.Ceiling(value * pow) / pow :
                Math.Floor(value * pow) / pow;
        }
 
 
上記RoundUpメソッドは、符号を無視して絶対値を切り上げる(常に正負の無限大へ近づく)丸めになります。
 
このページでは、上記RoundUpメソッドを実際に動かした時の挙動を確認できます。
 
値と、小数点以下の桁数を入力し実行ボタンをクリックすると、小数部を指定された桁数に成型した値を実行結果に表示します(小数点第二位までに成型したい場合は小数部桁数へ「2」を指定します)。
 
RoundUp( 
 , 
 ); 
実行結果:
 
 
以下にRoundUpメソッドの挙動をまとめました。「試す」ボタンをクリックすると、書式を入力エリアにコピーしますので、実際の動きを確認することができます。

●書式一覧

内容 書式 結果 試す
100.234を小数点第二位までに成型(小数点第三位を切り上げ) Truncate(100.234, 2); 100.24
-100.234を小数点第二位までに成型(小数点第三位を切り上げ) Truncate(-100.234, 2); -100.24
 

.NET 小数点以下を切り捨てる

C#、VB.NETで小数点以下を切り捨てる場合は、「Math.Floor」と「Math.Ceiling」メソッドを組み合わせ、用途に合わせてメソッドを自作する必要があります。
 
        /// <summary>
        /// 値の小数部を切り捨て、指定の桁数に丸めます
        /// </summary>
        /// <param name="value"></param>
        /// <param name="decimals">小数部桁数</param>
        /// <returns>丸められた値</returns>
        private double Truncate(double value, int decimals)
        {
            // 小数部桁数の10の累乗を取得
            double pow = Math.Pow(10, decimals);

            return 0 <= value ? Math.Floor(value * pow) / pow :
                Math.Ceiling(value * pow) / pow;
        }
 
 
上記Truncateメソッドは、符号を無視して絶対値を切り捨てる(常に0へ近づく)丸めになります。
 
このページでは、上記Truncateメソッドを実際に動かした時の挙動を確認できます。
 
値と、小数点以下の桁数を入力し実行ボタンをクリックすると、小数部を指定された桁数に成型した値を実行結果に表示します(小数点第二位までに成型したい場合は小数部桁数へ「2」を指定します)。
 
Truncate( 
 , 
 ); 
実行結果:
 
 
以下にTruncateメソッドの挙動をまとめました。「試す」ボタンをクリックすると、書式を入力エリアにコピーしますので、実際の動きを確認することができます。

●書式一覧

内容 書式 結果 試す
100.345を小数点第二位までに成型(小数点第三位を切り捨て) Truncate(100.345, 2); 100.34
-100.345を小数点第二位までに成型(小数点第三位を切り捨て) Truncate(-100.345, 2); -100.34
 

.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( 
 , 
 , 
 ); 
実行結果:
 
 

.NET String.Formatの動作確認

C#、VB.NETのString.Formatメソッドを実際に動かした時の挙動を確認できます。
 
String.Formatの書式と値を入力し実行ボタンをクリックすると、値を指定の書式に成型し実行結果に表示します。
 
書式指定:
String.Format(
 ",  
 );
 
プリミティブ型:
実行結果:
“”
 
※実行結果の半角スペースは「¸」で表します。
 
以下によく使用する幅指定、左詰め、右詰め、0埋め、カンマ編集、金額編集などの書式をまとめました。「試す」ボタンをクリックすると、書式を入力エリアにコピーしますので、実際の動きを確認することができます。

●書式一覧

成型内容 書式 結果 試す
幅指定(右詰め) 4文字の文字列(右詰め)に成型
String.Format("{0, 4}", 1);
"¸¸¸1"
幅指定(左詰め) 4文字の文字列(左詰め)に成型
String.Format("{0, -4}", 1);
"1¸¸¸"
0埋め 0埋め4文字の文字列に成型
String.Format("{0:D4}", 1);
"0001"
0埋め4文字の文字列に成型
String.Format("{0:0000}", 1);
"0001"
幅指定(右詰め)かつ0埋め 8文字の文字列(右詰め)に成型、そのうち4文字は0埋め
String.Format("{0, 8:D4}", 1);
"¸¸¸¸0001"
幅指定(左詰め)かつ0埋め 8文字の文字列(左詰め)に成型、そのうち4文字は0埋め
String.Format("{0, -8:D4}", 1);
"0001¸¸¸¸"
小数点編集 数値を小数点第二位に編集
String.Format("{0:F2}", 10.345);
"10.35"
幅指定(右詰め)かつ小数点編集 数値を小数点第二位に編集し、8文字の文字列(右詰め)に成型

String.Format("{0, 8:F2}", 10.345);
"¸¸¸10.35"
幅指定(左詰め)かつ小数点編集 数値を小数点第三位に編集し、8文字の文字列(左詰め)に成型

String.Format("{0, -8:F3}", 10.2345);
"10.235¸¸"
カンマ編集 整数をカンマ編集
String.Format("{0:N0}", 10000);
"10,000"
小数を含む数値をカンマ編集(小数点以下は2桁とする)
String.Format("{0:N2}", 12345.345);
"12,345.35"
幅指定(右詰め)かつカンマ編集 整数をカンマ編集し、8文字の文字列(右詰め)に成型
String.Format("{0, 8:N0}", 10000);
"¸¸10,000"
幅指定(左詰め)かつカンマ編集 小数を含む数値をカンマ編集し、10文字の文字列(左詰め)に成型
String.Format("{0, -10:N2}", 12345.345);
"12,345.35¸"
金額編集 整数を金額編集
String.Format("{0:C}", 10000);
"¥10,000"
小数を含む数値を金額編集(小数点以下は2桁とする)
String.Format("{0:C2}", 12345.345);
"¥12,345.35"
幅指定(右詰め)かつ金額編集 整数を金額編集し、8文字の文字列(右詰め)に成型
String.Format("{0, 8:C}", 10000);
"¸¥10,000"
幅指定(左詰め)かつ金額編集 小数を含む数値を金額編集し、11文字の文字列(左詰め)に成型
String.Format("{0, -11:C2}", 12345.345);
"¥12,345.35¸"
パーセント編集 数値に100をかけ、「%」記号を付ける
String.Format("{0:P2}", 0.12345);
"12.35%"
幅指定(右詰め)かつパーセント編集 数値をパーセント編集し、8文字の文字列(右詰め)に成型
String.Format("{0, 8:P2}", 0.12345);
"¸¸12.35%"
幅指定(左詰め)かつパーセント編集 数値をパーセント編集し、8文字の文字列(左詰め)に成型
String.Format("{0, -8:P2}", 0.12345);
"12.35%¸¸"
16進数変換 数値を16進数に変換
String.Format("{0:X}", 10);
"A"
数値を4文字の16進数に変換(桁が足りない場合は0埋め)
String.Format("{0:X4}", 10);
"000A"
g h T
 38,190 Total Views