🍣
C#での切り上げ、切り捨て、丸め処理
はじめに
C#での四捨五入や切り捨て等は、何も考えずに使用すると違和感のある結果となるので、まとめてみた
環境
C#を使用しています。.net6環境で動作確認してます。
Math関数の一覧
方式 | 関数名 | 説明 |
丸め | Round | 桁数指定可能、銀行型丸めと普通の丸めの選択可能 |
切り上げ | ceiling | 桁指定は不可 |
切り捨て | Truncate/Floor | 桁指定は不可 |
丸め処理(Round)
Console.WriteLine(Math.Round(2.5));
結果は、「2」になります。
四捨五入出来てません。他の引数の場合では、
引数 | 結果 |
2.4 | 2 |
2.5 | 2 |
2.6 | 3 |
2.9 | 3 |
こうなるのは、Math.Roundの四捨五入では「銀行型丸め」「最近偶数丸め」といった方法の為だそうです。これでは使いづらいので、引数で設定が出来る様になっています。
Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero));
結果は、「3」になります。
「MidpointRounding」は、列挙型で以下の種類があります。
列挙子 | 説明 |
AwayFromZero | 銀行型丸め/最近偶数丸め |
ToEven | 最も近い数値に丸める。数値が範囲の中間の場合には、最も違い偶数に丸める |
ToPositiveInfinity | 上向き丸め方式 |
ToZero | 0方向の丸目方式 |
指定しない場合には、「ToEven」となります。
切り上げ処理(Ceiling)
Console.WriteLine(Math.Ceiling(値));
結果は以下の通り
引数 | 結果 |
0.1 | 1 |
0.9 | 1 |
1.1 | 2 |
-0.1 | -0 |
-0.9 | -0 |
-1.1 | -1 |
桁の指定は出来ないみたいで、必ず小数点以下第1位を切り上げます。
切り捨て処理(Truncate/Floor)
Console.WriteLine("{0},{1}",
Math.Truncate(値),
Math.Floor(値)
);
結果は以下の通り
引数 | Truncate | Floor |
0.1 | 0 | 0 |
0.9 | 0 | 0 |
1.1 | 1 | 1 |
-0.1 | -0 | -1 |
-0.9 | -0 | -1 |
-1.1 | -1 | -2 |
こちらも、桁の指定は出来ないみたいで、必ず小数点以下第1位を処理します。
マイナスの時に違いがあります。
Truncateは単純に小数点部分を切り捨て、Floorは引数値より小さい値になるようにします。
切り上げ、切り捨てで桁指定
切り上げ、切り捨てした桁が第1位となるまで10倍する操作を行い、切り上げ、切り捨て処理を行った後に、元に戻す為に1/10倍する処理を行う事で、求めることが出来ます。
Console.WriteLine(Math.Truncate(値 * 10) / 10);
小数点以下第1位で切り上げを行うので、10倍した後、1/10しています。第2位の場合には、100倍、1/100倍して下さい。実際には、小数点の指定が出来た方が使いやすいですね。
他の値での結果は以下の通り
引数 | Truncate | Floor |
0.11 | 0.1 | 0.1 |
0.19 | 0.1 | 0.1 |
1.11 | 1.1 | 1.1 |
-0.11 | -0.1 | -0.2 |
-0.19 | -0.1 | -0.2 |
-1.11 | -1.1 | -1.2 |
Discussion