小数点以下の数値処理
C#でdoubleやdecimalといった小数点以下の値を持つ数値を扱う際、計算の要件に応じて「小数点以下を切り捨てて整数にしたい」または「小数点以下を切り上げて整数にしたい」という場面があります。
intへのキャスト (int) が「0(ゼロ)に向かって切り捨てる(Truncate)」動作であるのに対し、System.Mathクラスが提供するFloorとCeilingメソッドは、数値の「方向」に基づいた丸め処理を行います。
この記事では、Math.Floor(切り捨て)とMath.Ceiling(切り上げ)の具体的な動作と、両者の明確な違いについて解説します。
Math.Floor:切り捨て(負の無限大方向への丸め)
Math.Floorメソッドは、指定された数値以下の最大の整数値を返します。
これは、数値直線上において、その数値が存在する位置から**左側(負の無限大方向)**に最も近い整数を見つける動作に相当します。
10.8の場合、10が返されます。10.2の場合でも、10が返されます。
注意点: 負の数の場合の Floor
Math.Floorの動作がintキャストと明確に異なるのは、負の数を扱った場合です。
(int)-10.8は0に向かって切り捨てられるため-10になります。Math.Floor(-10.8)は負の無限大(左側)に向かって丸められるため-11になります。
Floor のコード例
Math.Floorは、double型とdecimal型の両方に対応しています。
using System;
public class FloorExample
{
public static void Main()
{
//--- double型の例 ---
double positiveValue = 15.7;
double negativeValue = -8.3;
// 15.7 以下の最大の整数は 15
Console.WriteLine($"Math.Floor({positiveValue}) = {Math.Floor(positiveValue)}");
// -8.3 以下の最大の整数は -9
Console.WriteLine($"Math.Floor({negativeValue}) = {Math.Floor(negativeValue)}");
// (参考) (int)キャストの場合 (0への切り捨て)
Console.WriteLine($"(int)({negativeValue}) = {(int)negativeValue}"); // -8
//--- decimal型の例 ---
// 例: 97個のアイテムを1箱10個で梱包する場合
decimal items = 97m;
decimal itemsPerBox = 10m;
decimal fullBoxes = Math.Floor(items / itemsPerBox); // 9.7 -> 9
Console.WriteLine($"---");
Console.WriteLine($"完全に梱包できる箱の数: {fullBoxes} 箱");
}
}
出力結果:
Math.Floor(15.7) = 15
Math.Floor(-8.3) = -9
(int)(-8.3) = -8
---
完全に梱包できる箱の数: 9 箱
Math.Ceiling:切り上げ(正の無限大方向への丸め)
Math.Ceiling(シーリング、天井の意)メソッドは、指定された数値以上の最小の整数値を返します。
これは、数値直線上において、その数値が存在する位置から**右側(正の無限大方向)**に最も近い整数を見つける動作に相当します。
10.8の場合、11が返されます。10.2の場合でも、11が返されます。-10.8の場合、それより大きい(右側にある)-10が返されます。
Ceiling のコード例
Ceilingは、double型とdecimal型の両方に対応しています。
using System;
public class CeilingExample
{
public static void Main()
{
//--- double型の例 ---
double positiveValue = 15.7;
double negativeValue = -8.3;
// 15.7 以上の最小の整数は 16
Console.WriteLine($"Math.Ceiling({positiveValue}) = {Math.Ceiling(positiveValue)}");
// -8.3 以上の最小の整数は -8
Console.WriteLine($"Math.Ceiling({negativeValue}) = {Math.Ceiling(negativeValue)}");
//--- decimal型の例 ---
// 例: 97人の乗客を1台10人乗りのバスで運ぶ場合
decimal passengers = 97m;
decimal capacityPerBus = 10m;
decimal requiredBuses = Math.Ceiling(passengers / capacityPerBus); // 9.7 -> 10
Console.WriteLine($"---");
Console.WriteLine($"必要なバスの台数: {requiredBuses} 台");
}
}
出力結果:
Math.Ceiling(15.7) = 16
Math.Ceiling(-8.3) = -8
---
必要なバスの台数: 10 台
動作の比較
Floor(床)とCeiling(天井)は、その名前の通り、数値を挟む下側と上側の整数を取得する操作です。
| 入力値 | Math.Floor (切り捨て) | Math.Ceiling (切り上げ) | (参考) (int)キャスト |
12.8 | 12 | 13 | 12 |
12.2 | 12 | 13 | 12 |
12.0 | 12 | 12 | 12 |
-12.8 | -13 | -12 | -12 |
-12.2 | -13 | -12 | -12 |
まとめ
Math.FloorとMath.Ceilingは、C#で小数点以下の数値を意図した方向に丸めるための標準的なメソッドです。
Math.Floor: 常に数値以下(左側)の整数を返します(負の無限大方向)。Math.Ceiling: 常に数値以上(右側)の整数を返します(正の無限大方向)。
特に負の数を扱う場合、intへのキャスト(0への切り捨て)とは動作が異なるため、要件に応じて適切に使い分けることが重要です。
