計算結果を表示・保存する前に、数値を丸める処理はよく必要になります。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(四捨五入+カンマ区切り)
よくある質問(FAQ)
Qceilやfloorの結果が整数になりません。
A
ceil() / floor() はfloat を返す仕様です。ceil(3.14) の実体は float(4) です。整数として扱うには (int)ceil(...) のようにキャストしてください。Q小数第2位まで四捨五入したいです。
A
round($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の数値処理に強くなれます。
