PHPで四捨五入・切り上げ・切り捨てする方法|round・ceil・floorと丸めモード

計算結果を表示・保存する前に、数値を丸める処理はよく必要になります。PHPには round()(四捨五入)・ceil()(切り上げ)・floor()(切り捨て)が用意されています。この記事では基本に加え、戻り値の型・負の数の挙動・丸めモードといった実務で差が出るポイントまで解説します。

この記事の結論:四捨五入は round()(第2引数で桁指定)、切り上げは ceil()、切り捨ては floor()ceil()floor() は浮動小数点(float)を返すので、整数が必要なら (int) でキャストします。
スポンサーリンク

round()で四捨五入する

round() は最も近い整数に四捨五入します。第2引数で小数点以下の桁数を指定できます。

round(桁指定あり)
<?php
echo round(3.14159);     // 3
echo round(3.14159, 2);  // 3.14(小数第2位まで)
echo round(1234.5678, -2); // 1200(負の桁=百の位で丸め)
第2引数に負の値を渡すと、十の位・百の位といった整数部の桁で丸められます(round(1234.5678, -2)1200)。

round()の丸めモード(.5の扱い)

round() は既定で「0.5は切り上げ(HALF_UP)」です。第3引数で丸め方を変更でき、金額計算などでは銀行家の丸め(偶数丸め・HALF_EVEN)が使われることがあります。

丸めモードの指定
<?php
echo round(2.5); // 3(既定: 0.5は切り上げ)
echo round(3.5); // 4

// 銀行家の丸め(.5は最も近い偶数へ)
echo round(2.5, 0, PHP_ROUND_HALF_EVEN); // 2
echo round(3.5, 0, PHP_ROUND_HALF_EVEN); // 4

ceil()で切り上げ・floor()で切り捨て

ceil() は常に大きい方の整数へ、floor() は常に小さい方の整数へ丸めます。

ceil / floor
<?php
echo ceil(3.14);  // 4
echo floor(3.99); // 3
ceil() / floor() の戻り値は整数ではなく float です。ceil(3.14)4 と表示されますが、実体は float(4) です。整数として厳密に扱いたい場合は (int)ceil(...) のようにキャストしてください。
整数が必要ならキャスト
<?php
$pages = (int) ceil(95 / 10); // 10件ずつのページ数 = 10(int)

負の数では「数直線上で大きい方/小さい方」に動くため、直感とずれることがあります。

負の数の挙動
<?php
echo ceil(-3.2);  // -3(大きい方=0に近い)
echo floor(-3.2); // -4(小さい方=0から離れる)

小数第N位で切り上げ・切り捨てる

ceil() / floor() は整数にしか丸められません。桁を指定したいときは、10のべき乗を掛けて丸め、割って戻します。

桁指定の切り上げ・切り捨て
<?php
// 小数第2位で切り上げ
echo ceil(3.14159 * 100) / 100;  // 3.15

// 小数第2位で切り捨て
echo floor(3.14159 * 100) / 100; // 3.14

表示用ならnumber_formatも四捨五入する

桁区切り付きで表示する number_format() も、指定桁で四捨五入します。「画面表示のために丸めつつカンマ区切りにしたい」場合に便利です。

number_formatで丸め+整形
<?php
echo number_format(1234.5678, 2); // 1,234.57(四捨五入+カンマ区切り)
桁区切りの詳細はnumber_formatで数値をカンマ区切りにする方法、ゼロ埋めは0埋めをする方法、絶対値は絶対値を取得する方法を参照してください。

よくある質問(FAQ)

Qceilやfloorの結果が整数になりません。
Aceil() / floor()float を返す仕様です。ceil(3.14) の実体は float(4) です。整数として扱うには (int)ceil(...) のようにキャストしてください。
Q小数第2位まで四捨五入したいです。
Around($number, 2) を使います。第2引数に残したい小数の桁数を指定します。負の値(例 -2)を渡すと、百の位など整数部で丸められます。
Qround(2.5)が3になります。2.0にできますか?
A既定は「0.5は切り上げ」なので round(2.5)3 です。銀行家の丸め(0.5を最も近い偶数へ)にするにはround(2.5, 0, PHP_ROUND_HALF_EVEN) とすると 2 になります。
Qfloor(-3.2)が-4になるのはなぜですか?
A切り捨ては「数直線上で小さい方の整数へ」動くためです。-3.2 より小さい整数は -4 です。0方向へ丸めたい場合は (int) キャスト(ゼロ方向切り捨て)も検討してください。

まとめ

PHPの丸め処理のポイントを整理します。

  • 四捨五入は round($n, 桁)、切り上げ ceil()、切り捨て floor()
  • ceil() / floor() は float を返す(int は (int) キャスト)
  • 負の数は floor(-3.2)=-4 のように0から離れる方向に動く
  • 0.5の扱いは PHP_ROUND_HALF_EVEN などモードで変更できる
  • 表示用に丸めつつ整形するなら number_format()

関連として、number_formatでカンマ区切り絶対値を取得する方法0埋めをする方法もあわせて読むと、PHPの数値処理に強くなれます。