閉じる

C#で数値を切り上げ・切り捨て!Math.CeilingとMath.Floorの正しい使い方と注意点を解説

C#で数値計算を行う際、小数点以下の値をどのように処理するかは非常に重要なテーマです。

特に、ビジネスアプリケーションやUIのレイアウト計算では、正確な切り上げや切り捨てが求められる場面が多々あります。

C#の標準ライブラリである.NETには、これらの操作を簡単に行うためのMath.CeilingメソッドとMath.Floorメソッドが用意されています。

本記事では、これらのメソッドの基本的な使い方から、負の数を扱う際の注意点、そして実務で役立つ具体的な活用例までを詳しく解説します。

2026年現在の最新の.NET環境においても、これらの数学関数の挙動は基本に忠実であり、正しく理解しておくことがバグのないコードを書くための第一歩となります。

Math.Ceilingメソッドによる切り上げの基本

Math.Ceilingは、指定した数値以上の最小の整数値を返すメソッドです。

「Ceiling」とは英語で「天井」を意味し、数値を天井に向かって押し上げるイメージを持つと分かりやすいでしょう。

このメソッドは、小数点以下に少しでも値がある場合、それより大きい整数のうち最も近い値を選択します。

Math.Ceilingの構文と戻り値

Math.Ceilingメソッドには、主にdouble型とdecimal型を受け取るオーバーロードが存在します。

C#
// double型を使用する場合
double value1 = 12.3;
double result1 = Math.Ceiling(value1); // 結果は 13.0

// decimal型を使用する場合
decimal value2 = 45.1m;
decimal result2 = Math.Ceiling(value2); // 結果は 46
実行結果
result1: 13
result2: 46

戻り値の型は、引数として渡した型と同じになる点に注目してください。

引数がdoubleであれば戻り値もdoubleになり、decimalであればdecimalとなります。

もし整数型(intやlong)として結果を受け取りたい場合は、明示的なキャストが必要になります。

正の数における切り上げの挙動

正の数に対してMath.Ceilingを使用すると、直感的な切り上げが行われます。

例えば、10.01という数値を渡すと、結果は11.0になります。

たとえ小数点以下の値が非常に小さくても、必ず大きい方の整数に切り上げられます。

逆に、小数点以下がゼロである10.0を渡した場合は、そのまま10.0が返されます。

Math.Floorメソッドによる切り捨ての基本

次に、小数点以下を切り捨てるために使用されるMath.Floorメソッドについて解説します。

「Floor」は「床」を意味し、数値を床に向かって引き下げる操作を行います。

Math.Floorは、指定した数値以下の最大の整数値を返します。

Math.Floorの構文とサンプルコード

使い方はMath.Ceilingと同様で、数値型を引数に取ります。

C#
// double型での切り捨て
double value1 = 12.9;
double result1 = Math.Floor(value1); // 結果は 12.0

// decimal型での切り捨て
decimal value2 = 45.99m;
decimal result2 = Math.Floor(value2); // 結果は 45
実行結果
result1: 12
result2: 45

このように、12.9のように限りなく次の整数に近い値であっても、容赦なく小数点以下が取り除かれた整数値が得られます。

正の数における切り捨ての仕組み

正の数に対するMath.Floorは、単純に「小数点以下を捨てる」というイメージで間違いありません。

3.53.0になり、3.93.0になります。

ただし、後述する「負の数」の場合にはこのイメージだけでは不十分なため、注意が必要です。

負の数における挙動の違いと注意点

C#の数値操作において、初心者が最も間違いやすいのが「負の数」に対する切り上げと切り捨てです。

数学的な定義に基づくと、切り上げと切り捨ては数直線上の「右方向」か「左方向」かで決まります。

負の数の切り上げ(Math.Ceiling)

Math.Ceilingは「指定された数以上の最小の整数」を返します。

負の数、例えば-1.5に対してMath.Ceilingを適用すると、結果は-1.0になります。

-1.5より大きい整数のうち、最も近いものは-1であるためです。

これは、絶対値で見ると「小さくなっている」ように見えるため、直感と異なる場合があります。

負の数の切り捨て(Math.Floor)

同様に、Math.Floor-1.5に適用すると、結果は-2.0になります。

-1.5以下の最大の整数は-2だからです。

数直線上では、常に左側に向かって進むのがMath.Floorの特徴です。

負の数における処理結果の比較

理解を深めるために、以下の表で値を比較してみましょう。

入力値Math.Ceiling (切り上げ)Math.Floor (切り捨て)
1.22.01.0
1.82.01.0
-1.2-1.0-2.0
-1.8-1.0-2.0

負の数の場合、Math.Ceilingを使うと「0に近い方」へ、Math.Floorを使うと「0から遠い方」へ移動することが分かります。

Math.Truncateメソッドとの違い

切り捨てと混同されやすいメソッドにMath.Truncateがあります。

Math.Truncateは「数値を0の方向に丸める(端数除去)」という動作をします。

FloorとTruncateの決定的な違い

正の数であればMath.FloorMath.Truncateの結果は一致します。

しかし、負の数においては挙動が異なります。

C#
double val = -1.9;
double floorResult = Math.Floor(val);     // 結果は -2.0
double truncateResult = Math.Truncate(val); // 結果は -1.0
実行結果
Math.Floor: -2
Math.Truncate: -1

「単純に小数点以下を消去したい」という目的であれば、負の数も考慮するとMath.Truncateの方が意図に近い場合があります。

一方で、数学的な「床関数」を必要とするアルゴリズムではMath.Floorが適切です。

データ型による精度の違い:double vs decimal

C#でこれらのメソッドを使う際、引数の型には注意を払う必要があります。

double型は浮動小数点数であり、内部的な表現の都合上、極めて小さな誤差が生じることがあります。

例えば、本来なら1.0になるはずの計算結果が内部的に0.99999999999999となっている場合、Math.Floorを適用すると0になってしまいます。

金融計算ではdecimalを使用する

お金の計算など、1円の狂いも許されない処理ではdecimal型を使用するのが鉄則です。

Math.Ceiling(decimal)Math.Floor(decimal)を使用することで、浮動小数点特有の丸め誤差を回避できます。

C#
// 金融計算の例
decimal price = 100.5m;
decimal taxRate = 0.08m;
decimal total = price * taxRate; // 8.04

decimal roundedTotal = Math.Floor(total); // 8

このように、末尾にmを付けて宣言するdecimal型を活用することで、信頼性の高い計算が可能になります。

実践的な活用シーン

Math.CeilingMath.Floorは、実際の開発現場でどのように使われているのでしょうか。

よくある2つのケースを紹介します。

1. ページネーションの総ページ数計算

Webアプリケーションなどで、全アイテム数から総ページ数を算出する際にMath.Ceilingが役立ちます。

例えば、全105件のアイテムがあり、1ページに10件表示する場合、ページ数は11ページ必要です。

C#
int totalItems = 105;
int itemsPerPage = 10;

// int同士の割り算は切り捨てられるため、doubleにキャストしてCeilingを適用
int totalPages = (int)Math.Ceiling((double)totalItems / itemsPerPage);
実行結果
totalPages: 11

このように、余りが出る場合に「もう1ページ追加する」というロジックを簡潔に記述できます。

2. 単位を揃えるグリッドレイアウト

UIのデザインにおいて、要素の幅を特定のピクセル単位(例:8px単位)に揃えたい場合があります。

この場合、一度単位で割ってから切り上げまたは切り捨てを行い、再び単位を掛けるという手法が使われます。

C#
double rawWidth = 123.45;
int gridUnit = 8;

// 8px単位で切り上げ
double snappedWidth = Math.Ceiling(rawWidth / gridUnit) * gridUnit;
実行結果
snappedWidth: 128

このテクニックを使えば、画面上の要素を綺麗に整列させることができます。

任意の桁数での切り上げ・切り捨て

Math.CeilingMath.Floorは、標準では「整数」への丸めしか行いません。

「小数点第2位で切り上げたい」といった要望がある場合は、桁移動の処理を組み合わせます。

小数点以下の桁を指定するコード例

以下のコードは、小数点第2位(100の位)を基準に処理を行う例です。

C#
double val = 1.23456;
double factor = Math.Pow(10, 2); // 100

// 小数点第2位で切り上げ
double result = Math.Ceiling(val * factor) / factor;
実行結果
result: 1.24

一度100倍して123.456にし、その状態でMath.Ceilingを適用して124にした後、再び100で割ることで1.24を得ています。

汎用的に使いたい場合は、拡張メソッドとして定義しておくと便利でしょう。

まとめ

C#におけるMath.CeilingMath.Floorは、数値を整えるための最も基本的かつ強力なメソッドです。

Math.Ceilingは「指定された数以上の最小の整数(切り上げ)」を返します。

Math.Floorは「指定された数以下の最大の整数(切り捨て)」を返します。

特に負の数を扱う際は、数直線上の動きを意識し、Math.Truncateとの違いを明確に理解しておくことがバグ防止に繋がります。

また、計算の精度が求められる場面では、doubleではなくdecimalを選択することも忘れないでください。

これらの特性を正しく理解し、用途に合わせて適切なメソッドを選択することで、より堅牢で正確なプログラムを実装できるようになります。

日々のコーディングにおいて、まずは正の数での基本的な動作を確認し、徐々に特殊なケースへの対応を身につけていきましょう。

URLをコピーしました!