🍣

C#での切り上げ、切り捨て、丸め処理

2022/03/02に公開

はじめに

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