端数処理
C#およびVB.NETでの端数処理の方法についてまとめました。
数値等に対する処理(数学関連の機能)は、System.Mathクラスを利用します。
端数処理もそれぞれ用意されているのでそれを利用することになりますが、特に四捨五入と切り上げの処理については注意が必要です。
結論
結論を先にまとめてしまうと、端数処理はそれぞれ次のメソッドを使用することで対応できます。
- 切り上げ
- Math.Ceiling メソッドを使用する。
- 切り捨て
-
Math.Floor もしくは Math.Truncate メソッドを使用する。
ただし、負の数に対する処理結果に違いが出るので注意。 - 四捨五入
-
Math.Round メソッド(引数に MidpointRounding.AwayFromZero を指定)を使用する。
デフォルトの Math.Round メソッドの場合、最近接偶数丸め(銀行丸め)で処理されてしまう。
以下、C#/VB.NETでのサンプルです。
切り上げ(Math.Ceiling)
端数の切り上げ処理には、Math.Ceiling メソッドを使います。このメソッドでは引数の数値以上の整数のうち、最小の値を返すことで端数切り上げ処理を行います。
C#
var data = new double[] { 2.4, 2.5, 2.6, -2.4, -2.5, -2.6 };
// 処理結果:3, 3, 3, -2, -2, -2
foreach (var n in data)
{
// 指定した数より大きい整数値のうち最小の値を返す
var c = Math.Ceiling(n);
Console.WriteLine("Math.Ceiling({0}) => {1}", n, c);
}
VB
Dim data() As Double = { 2.4, 2.5, 2.6, -2.4, -2.5, -2.6 }
' 処理結果:3, 3, 3, -2, -2, -2
For Each n In data
Dim c As Double = Math.Ceiling(n)
Console.WriteLine("Math.Ceiling({0}) => {1}", n, c)
Next
切り捨て(Math.Floor, Math.Truncate)
端数の切り捨て処理には、Math.Floor もしくは Math.Truncate メソッドを使用します。
Math.Floorメソッドは、引数の数値以下のうち最大の整数を返します。
Math.Truncateメソッドは、引数の数値の整数部分を返します。
いずれのメソッドを使用しても正の数の場合は同様の結果が得られますが、負の数の場合に処理結果が異なってきます。
例えば -2.4 を処理する場合、Math.Floorメソッドは引数以下の最大の整数を返すので -3 となりますが、Math.Truncateメソッドの場合は 単純に整数部分を返すので -2 となります。
端数の切り捨てを行う場合は、負の数を取りうるかどうかで使い分ける必要があります。
C#
var data = new double[] { 2.4, 2.5, 2.6, -2.4, -2.5, -2.6 };
// 処理結果(Floor):2, 2, 2, -3, -3, -3
// 処理結果(Truncate):2, 2, 2, -2, -2, -2
foreach (var n in data)
{
// 指定した数以下の最大の整数値を返す
var f = Math.Floor(n);
Console.WriteLine("Math.Floor({0}) => {1}", n, f);
// 指定した数の整数部分を返す
var t = Math.Truncate(n);
Console.WriteLine("Math.Truncate({0}) => {1}", n, t);
}
VB
Dim data() As Double = { 2.4, 2.5, 2.6, -2.4, -2.5, -2.6 }
' 処理結果(Floor):2, 2, 2, -3, -3, -3
' 処理結果(Truncate):2, 2, 2, -2, -2, -2
For Each n In data
' 指定した数以下の最大の整数値を返す
Dim f As Double = Math.Floor(n)
Console.WriteLine("Math.Floor({0}) => {1}", n, f)
' 指定した数の整数部分を返す
Dim t As Double = Math.Truncate(n)
Console.WriteLine("Math.Truncate({0}) => {1}", n, t)
Next
四捨五入と最近接偶数丸め(Math.Round)
四捨五入(端数が0.5未満で切り捨て、0.5以上で切り上げ)には、 Math.Round メソッドを使用します。
ただし単純にこのメソッドを使用すると、端数が0.5の時に結果が偶数になるように丸め処理が行われます。
例えば、2.5を丸めた場合に2となってしまいます。
この丸め方法は最近接偶数丸め(偶数丸め)や銀行丸めと呼ばれ、四捨五入より誤差が小さく丸め処理を行えます。
C#/VB.NETでは最近接偶数丸めがデフォルトとなっています。
四捨五入をするには引数で四捨五入を指定する必要があります。
Math.Round メソッドの引数で、戻り値の小数部の桁数を指定することも可能です。
C#
var data = new double[] { 2.4, 2.5, 2.6, -2.4, -2.5, -2.6 };
// 処理結果(Round) 2, 2, 3, -2, -2, -3
foreach (var n in data)
{
var r = Math.Round(n);
Console.WriteLine("Math.Round({0}) => {1}", n, r);
}
// 処理結果(Round, MidpointRounding.AwayFromZero) 2, 3, 3, -2, -3, -3
foreach (var n in data)
{
var r = Math.Round(n, MidpointRounding.AwayFromZero);
Console.WriteLine("Math.Round({0}, MidpointRounding.AwayFromZero) => {1}", n, r);
}
// 処理結果:12.35
var x = 12.345;
var result = Math.Round(x, 2, MidpointRounding.AwayFromZero);
Console.WriteLine("Math.Round({0}, 2, MidpointRounding.AwayFromZero) => {1}", x, result);
VB
Dim data() As Double = { 2.4, 2.5, 2.6, -2.4, -2.5, -2.6 }
' 処理結果(Round) 2, 2, 3, -2, -2, -3
For Each n In data
Dim r As Double = Math.Round(n)
Console.WriteLine("Math.Round({0}) => {1}", n, r)
Next
' 処理結果(Round, MidpointRounding.AwayFromZero) 2, 3, 3, -2, -3, -3
For Each n In data
Dim r As Double = Math.Round(n, MidpointRounding.AwayFromZero)
Console.WriteLine("Math.Round({0}, MidpointRounding.AwayFromZero) => {1}", n, r)
Next
' 処理結果:12.35
Dim x AS Double = 12.345
Dim result As Double = Math.Round(x, 2, MidpointRounding.AwayFromZero)
Console.WriteLine("Math.Round({0}, 2, MidpointRounding.AwayFromZero) => {1}", x, result)
コメントを書く