Math.Abs() / Math.Round() / Math.Ceiling() / Math.Floor()
| 対応: | C# 1.0(2002) |
|---|
数値の絶対値を返す『Math.Abs()』、四捨五入する『Math.Round()』、切り上げる『Math.Ceiling()』、切り捨てる『Math.Floor()』の使い方です。
構文
using System; // 絶対値を返します(負の数を正にします)。 Math.Abs(double value) // 最も近い整数に丸めます(銀行丸めがデフォルト)。 Math.Round(double value) Math.Round(double value, int digits) Math.Round(double value, MidpointRounding mode) // 切り上げ(指定値以上の最小整数)を返します。 Math.Ceiling(double value) // 切り捨て(指定値以下の最大整数)を返します。 Math.Floor(double value) // ゼロ方向への切り捨て(小数部を取り除く)を返します。 Math.Truncate(double value)
メソッド一覧
| メソッド | 概要 |
|---|---|
| Math.Abs(value) | value の絶対値を返します。int, long, double, decimal など各数値型のオーバーロードがあります。 |
| Math.Round(value) | value を最も近い整数に丸めます。デフォルトは「銀行丸め(偶数丸め)」です。 |
| Math.Round(value, digits) | value を小数点以下 digits 桁で丸めます。 |
| Math.Round(value, MidpointRounding.AwayFromZero) | 一般的な四捨五入(0.5 は必ず切り上げ)を行います。 |
| Math.Ceiling(value) | value 以上の最小の整数を返します(常に切り上げ)。 |
| Math.Floor(value) | value 以下の最大の整数を返します(常に切り捨て)。 |
| Math.Truncate(value) | value の小数部を除いた整数部分を返します。負の数でも Floor とは異なります。 |
サンプルコード
Program.cs
using System; // Math.Abs() — 絶対値を取得します。 Console.WriteLine(Math.Abs(-42)); // 42 Console.WriteLine(Math.Abs(3.14)); // 3.14 Console.WriteLine(Math.Abs(-7.5)); // 7.5 // Math.Round() — 丸め処理を行います。 Console.WriteLine(Math.Round(2.5)); // 2(銀行丸め: 偶数側に丸める) Console.WriteLine(Math.Round(3.5)); // 4(銀行丸め: 偶数側に丸める) // MidpointRounding.AwayFromZero を指定すると一般的な四捨五入になります。 Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero)); // 3 Console.WriteLine(Math.Round(3.14159, 2)); // 3.14(小数点 2 桁で丸め) // Math.Ceiling() — 切り上げ(常に大きい方向へ)します。 Console.WriteLine(Math.Ceiling(4.1)); // 5 Console.WriteLine(Math.Ceiling(4.9)); // 5 Console.WriteLine(Math.Ceiling(-4.1)); // -4(ゼロ方向へ切り上げ) // Math.Floor() — 切り捨て(常に小さい方向へ)します。 Console.WriteLine(Math.Floor(4.9)); // 4 Console.WriteLine(Math.Floor(-4.1)); // -5(ゼロから遠い方向へ切り捨て) // Math.Truncate() — 小数部を除いた整数部分を返します。 Console.WriteLine(Math.Truncate(4.9)); // 4 Console.WriteLine(Math.Truncate(-4.9)); // -4(Floor と違いゼロ方向へ)
dotnet run 42 3.14 7.5 2 4 3 3.14 5 5 -4 4 -5 4 -4
サンプルコード: 実用例(消費税の切り捨て)
小数の切り捨てが必要な実用的な例として、消費税計算を示します。
TaxCalculator.cs
using System;
// 商品価格に消費税 10% を加算して、小数点以下を切り捨てます。
double price = 980;
double taxRate = 0.10;
double total = Math.Floor(price * (1 + taxRate));
Console.WriteLine($"合計金額: {total} 円"); // 合計金額: 1078 円
// ページング: n 件のデータを 1 ページ k 件で表示するときの総ページ数を算出します。
int itemCount = 25;
int pageSize = 7;
int pageTotal = (int)Math.Ceiling((double)itemCount / pageSize);
Console.WriteLine($"総ページ数: {pageTotal}"); // 総ページ数: 4
dotnet run 合計金額: 1078 円 総ページ数: 4
よくあるミス
よくあるミス: Math.Round() の銀行丸め
Math.Round() のデフォルトは「銀行丸め(偶数丸め)」です。0.5 の場合、偶数側に丸めるため、2.5 は 2 に、3.5 は 4 になります。一般的な「0.5 は切り上げ」を期待して使うとバグになります。
using System; // NG: デフォルトの Round は銀行丸め(0.5 が偶数側に丸まる) Console.WriteLine(Math.Round(0.5)); // 0(切り上げのつもりで 1 を期待していた) Console.WriteLine(Math.Round(1.5)); // 2 Console.WriteLine(Math.Round(2.5)); // 2(切り上げのつもりで 3 を期待していた)
修正後は次の通りです。
using System; // OK: MidpointRounding.AwayFromZero で一般的な四捨五入を行う Console.WriteLine(Math.Round(0.5, MidpointRounding.AwayFromZero)); // 1 Console.WriteLine(Math.Round(1.5, MidpointRounding.AwayFromZero)); // 2 Console.WriteLine(Math.Round(2.5, MidpointRounding.AwayFromZero)); // 3
dotnet run 0 2 2 1 2 3
概要
『Math.Round()』のデフォルトは「銀行丸め(偶数丸め)」です。2.5 を四捨五入すると 3 ではなく 2 になるので注意が必要です。一般的な「0.5 は切り上げ」の四捨五入を行うには MidpointRounding.AwayFromZero を指定してください。
『Math.Ceiling()』と『Math.Floor()』は負の数で直感に反する結果になる場合があります。Ceiling(-4.1) は -4、Floor(-4.1) は -5 を返します。ゼロ方向への切り捨てには『Math.Truncate()』を使用してください。その他の数値計算メソッドについてはMath.Max() / Min() / Pow() / Sqrt()をご確認ください。
記事の間違いや著作権の侵害等ございましたらお手数ですがこちらまでご連絡頂ければ幸いです。