この記事では、C#での小数点以下の丸め処理(四捨五入、切り上げ、切り下げ等)について解説します。
小数点以下の数値を取り扱うとき、値を丸めたくなりますよね。
しかし、丸め処理には様々な種類があります。それをしっかり理解しておかないと、意図しない計算結果を生み出しかねません。
C#では各種丸め処理を簡単に実装できるようになっていますので、当記事のサンプルを参考にぜひ実践してみてください!

小さな誤差も積み重なると無視できなくなります。
適切な丸め処理を選択できるようになりましょう。
概要
丸め処理メソッド一覧
C#で小数点以下の数値を丸めたい時は、Mathクラスのメソッドを使います。
まず、当記事で解説するメソッドをまとめましたので確認してみましょう。
メソッド | 説明 | 例 |
---|---|---|
Round(value) | 銀行丸め | 1.5 → 2 2.5 → 2 |
Round(value, MidpointRounding.AwayFromZero) | 四捨五入 | 1.5 → 2 2.5 → 3 |
Ceiling(value) | 小数点以下切り上げ | 1.5 → 2 -1.5 → -1 |
Floor(value) | 小数点以下切り下げ | 1.5 → 1 -1.5 → -2 |
Truncate(value) | 小数点以下切り捨て (整数部分を取得) | 1.5 → 1 -1.5 → -1 |
注意点
Roundメソッドは、MidpointRounding引数の有無で処理が異なりますので、要注意です。
引数なしの場合は、いわゆる「銀行丸め」処理となります。
「銀行丸め」という言葉に馴染みのない方もいるかもしれませんが、安心してください。次項で詳しく解説していきます。
また、FloorメソッドとTruncateメソッドの違いにも要注意です。
こちらも詳しく解説していきますので、次項でサンプルと合わせて確認しましょう。
サンプル&詳細解説
Roundメソッド(銀行丸め)
Roundメソッドの引数で丸め規則を指定しなかった場合は、「銀行丸め」での処理となります。
銀行丸めとは、対象の小数が5の時に、最も近い偶数に丸める方式のことです。
例えば、10.5を四捨五入したら11ですが、銀行丸めの場合は偶数になるように丸めるので10となります。
小数が5以外の時の処理は、通常の四捨五入と同じです。
この方式は、丸めた数値を累積した時に誤差が少なくなるという特徴があります。
サンプルコードでも確認してみましょう。
サンプルコード
using System;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
// 1.5を銀行丸め
double val = 1.5;
double roundVal = Math.Round(val);
Console.WriteLine($"1.5 -> {roundVal}");
// 2.5を銀行丸め
val = 2.5;
roundVal = Math.Round(val);
Console.WriteLine($"2.5 -> {roundVal}");
// 3.5を銀行丸め
val = 3.5;
roundVal = Math.Round(val);
Console.WriteLine($"3.5 -> {roundVal}");
Console.ReadKey();
}
}
}
実行結果
1.5 -> 2
2.5 -> 2
3.5 -> 4
1.5と3.5は四捨五入と同じで切り上げられますが、2.5の時は2に切り下げられる結果となりました。
これが銀行丸め処理です。
「Roundメソッド=四捨五入」で覚えてしまうと、意図せず銀行丸めで処理してしまうことになるので注意しましょう。
一般的な四捨五入をしたい場合は、次に解説する丸め規則を指定する方式を使ってください。
Roundメソッド(四捨五入)
Roundメソッドで、MidpointRounding.AwayFromZeroを引数で指定すると一般的な四捨五入による丸め処理が行えます。
サンプルコード
using System;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
// 1.5を四捨五入
double val = 1.5;
double roundVal = Math.Round(val, MidpointRounding.AwayFromZero);
Console.WriteLine($"1.5 -> {roundVal}");
// 2.5を四捨五入
val = 2.5;
roundVal = Math.Round(val, MidpointRounding.AwayFromZero);
Console.WriteLine($"2.5 -> {roundVal}");
// 3.5を四捨五入
val = 3.5;
roundVal = Math.Round(val, MidpointRounding.AwayFromZero);
Console.WriteLine($"3.5 -> {roundVal}");
Console.ReadKey();
}
}
}
実行結果
1.5 -> 2
2.5 -> 3
3.5 -> 4
一般的な四捨五入の結果となります。詳しい説明は不要でしょう。
Ceilingメソッド(切り上げ)
Ceilingメソッドは、小数の切り上げを行います。
サンプルコード
using System;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
// 1.5を切り上げ
double val = 1.5;
double ceilingVal = Math.Ceiling(val);
Console.WriteLine($"1.5 -> {ceilingVal}");
// -1.5を切り上げ
val = -1.5;
ceilingVal = Math.Ceiling(val);
Console.WriteLine($"-1.5 -> {ceilingVal}");
Console.ReadKey();
}
}
}
実行結果
1.5 -> 2
-1.5 -> -1
切り上げですので、負数の場合は0に近づく方向に丸められます。
Floorメソッド(切り下げ)
Floorメソッドは、小数の切り下げを行います。
サンプルコード
using System;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
// 1.5を切り下げ
double val = 1.5;
double floorVal = Math.Floor(val);
Console.WriteLine($"1.5 -> {floorVal}");
// -1.5を切り下げ
val = -1.5;
floorVal = Math.Floor(val);
Console.WriteLine($"-1.5 -> {floorVal}");
Console.ReadKey();
}
}
}
実効結果
1.5 -> 1
-1.5 -> -2
切り下げでは、値が小さくなるように丸められます。そのため、負数の場合は0から離れる方向への丸めとなります。
次に解説するTruncateメソッドとの違いに注意しましょう。
Truncateメソッド(切り捨て)
Truncateメソッドは、小数の切り捨てを行います。
サンプルコード
using System;
namespace SampleCode
{
class SampleCode
{
static void Main()
{
// 1.5を切り捨て(整数部分の取得)
double val = 1.5;
double truncateVal = Math.Truncate(val);
Console.WriteLine($"1.5 -> {truncateVal}");
// -1.5を切り捨て(整数部分の取得)
val = -1.5;
truncateVal = Math.Truncate(val);
Console.WriteLine($"-1.5 -> {truncateVal}");
Console.ReadKey();
}
}
}
実効結果
1.5 -> 1
-1.5 -> -1
こちらはFloorメソッドと違って、負数の時に0に近づく方向に丸められています。
このような動作から、切り捨て処理は「整数部分の取得」とも言い換えられます。
FloorとTruncateの違いは意識しておかないと計算ミスにつながりますので、注意しましょう。
まとめ
以下は当記事のまとめです!
- Mathクラスのメソッドで各種丸め処理を行える。
- Roundメソッドは、引数で丸め規則を指定しないと銀行丸め処理となる。
- Floorメソッド(切り下げ)は、負数の時0から離れる方向に丸められる。
- Truncateメソッド(切り捨て)は、値の整数部分を取得する。
数値の丸め処理は一通り理解できましたか?
小数の取り扱いによる誤差は小さな値かもしれませんが、場合によっては大きな問題に発展する可能性もあります。しっかりと理解したうえで実装するようにしましょう。
気になった処理はサンプルコードを元に数値を変えてみて、実際の結果を確かめてみるとより理解が深まります。
コメント