金額の端数処理や平均点の丸め、パーセント表示など、PHP で数値を扱うときには「四捨五入したい」「切り上げたい」「小数を切り捨てたい」といった場面が頻繁に出てきます。こうした計算を担うのが round()・ceil()・floor()・abs() の4つの関数です。この記事では、それぞれの基本的な使い方から、round() で桁数を指定する方法や丸めモード、戻り値の型の落とし穴、消費税計算などの実用例まで、初心者にもわかりやすく解説します。
目次
4つの関数でできること
まずは4つの関数がそれぞれ何をするのかを整理しておきましょう。いずれも数値を1つ渡すと、丸めた結果を返してくれるシンプルな関数です。
| 関数 | 役割 | 例 |
|---|---|---|
round() | 四捨五入する | round(3.5) → 4.0 |
ceil() | 切り上げる(大きい方の整数へ) | ceil(3.1) → 4.0 |
floor() | 切り捨てる(小さい方の整数へ) | floor(3.9) → 3.0 |
abs() | 絶対値を返す(符号を取る) | abs(-5) → 5 |
「ceil」は英語で天井、「floor」は床という意味で、数直線を上下にイメージすると覚えやすくなります。切り上げは天井(上)へ、切り捨ては床(下)へ寄せる、というわけです。
四捨五入する round()
round() は数値を四捨五入します。第1引数だけを渡すと、小数点以下第1位を四捨五入して整数(に相当する値)にします。
<?php
echo round(3.4); // 3
echo round(3.5); // 4
echo round(3.6); // 4
echo round(-3.5); // -4(負の数も絶対値で四捨五入)
precision で小数点以下の桁数を指定する
round() の第2引数 precision に桁数を渡すと、小数点以下を何桁残すかを指定できます。たとえば 2 を渡せば小数点以下第2位まで残し、第3位を四捨五入します。
<?php
echo round(3.14159, 2); // 3.14(第3位を四捨五入)
echo round(3.14159, 3); // 3.142
echo round(2.5, 0); // 3(桁数0は整数へ)
precision には負の値も指定できます。負の桁を渡すと、小数点より左(10の位・100の位など)で丸められます。金額を「100円単位」「1000円単位」に整えたいときに便利です。
<?php
echo round(1234, -1); // 1230(10の位で四捨五入)
echo round(1250, -2); // 1300(100の位で四捨五入)
echo round(1499, -3); // 1000(1000の位で四捨五入)
丸めモード(PHP_ROUND_HALF_UP など)
ちょうど半分(0.5)のときにどちらへ丸めるかは、第3引数の丸めモードで変えられます。省略時は PHP_ROUND_HALF_UP(一般的な四捨五入)です。指定できる定数は次の4つです。
| 定数 | 0.5 のときの丸め方 | round(2.5) / round(3.5) |
|---|---|---|
PHP_ROUND_HALF_UP | 0から遠い方へ(通常の四捨五入) | 3 / 4 |
PHP_ROUND_HALF_DOWN | 0に近い方へ | 2 / 3 |
PHP_ROUND_HALF_EVEN | 近い方の偶数へ | 2 / 4 |
PHP_ROUND_HALF_ODD | 近い方の奇数へ | 3 / 3 |
<?php
echo round(2.5, 0, PHP_ROUND_HALF_UP); // 3
echo round(2.5, 0, PHP_ROUND_HALF_DOWN); // 2
echo round(2.5, 0, PHP_ROUND_HALF_EVEN); // 2(近い偶数)
echo round(3.5, 0, PHP_ROUND_HALF_EVEN); // 4(近い偶数)
PHP_ROUND_HALF_EVEN は「銀行丸め」とも呼ばれ、0.5 を切り上げ続けることで生じる合計のずれを抑える目的で使われます。会計処理など、丸めの偏りを避けたい場面で選択肢になります。
切り上げる ceil() と切り捨てる floor()
ceil() は小数点以下があれば必ず切り上げ、floor() は必ず切り捨てます。四捨五入と違い、0.1 でも 0.9 でも扱いは変わりません。
<?php
echo ceil(3.1); // 4
echo ceil(3.9); // 4
echo floor(3.1); // 3
echo floor(3.9); // 3
負の数を扱うときは向きに注意します。切り上げは「数直線上でより大きい方(右)」、切り捨ては「より小さい方(左)」へ動くので、負の数では直感と逆に感じることがあります。
<?php
echo ceil(-3.5); // -3(大きい方=0に近い方へ)
echo floor(-3.5); // -4(小さい方=0から遠い方へ)
絶対値を返す abs()
abs() は数値の絶対値、つまり符号を取り除いた値を返します。負の数は正に、正の数はそのままです。2つの値の差が「何ズレているか」を、プラスマイナスに関係なく知りたいときによく使います。
<?php
echo abs(-5); // 5
echo abs(5); // 5
echo abs(-3.14); // 3.14
// 2つの値の差(どちらが大きくても正の数)
$diff = abs(80 - 95); // 15
abs() は他の3つと違い、渡した値が整数(int)なら整数を、小数(float)なら小数を返します。整数を渡したときに .0 が付かないのはそのためです。
戻り値は float になることに注意
つまずきやすいのが戻り値の型です。ceil()・floor()・round() の3つは、たとえ結果が整数のように見えてもfloat(浮動小数点数)を返します。var_dump() で確認すると、この違いがはっきりわかります。
<?php
var_dump(ceil(3.1)); // float(4)
var_dump(floor(3.9)); // float(3)
var_dump(round(3.5)); // float(4)
var_dump(abs(-5)); // int(5) ← abs だけ int を保つ
echo で表示するぶんには 4.0 ではなく 4 と出るため気づきにくいのですが、型に厳密な比較(===)や、整数を要求する関数に渡すときに問題になります。整数として扱いたい場合は、結果を (int) でキャストしておくと安全です。
<?php
var_dump(floor(3.9) === 3); // false(float(3) と int(3))
var_dump((int) floor(3.9) === 3); // true(int にそろえる)
消費税の端数処理に使う
実務で最も出番が多いのが金額の端数処理です。たとえば税抜価格に消費税(10%)を掛けると小数が出るので、円未満を切り捨てて請求額を決める、といった処理を floor() で書けます。切り上げにしたいなら ceil()、四捨五入なら round() に差し替えるだけです。
<?php
$price = 1980; // 税抜価格
$taxRate = 0.10; // 消費税10%
// 税込価格(円未満は切り捨て)
$total = floor($price * (1 + $taxRate));
echo $total; // 2178
// 消費税額だけを四捨五入で求める場合
$tax = round($price * $taxRate);
echo $tax; // 198
どの丸め方を採用するかは、扱う商取引のルールによって決まります。「消費税の端数は切り捨て」と決めている店舗もあれば四捨五入の店舗もあるため、要件に合わせて関数を選びましょう。
平均点やパーセント表示での使い方
集計結果の見せ方でも、これらの関数が活躍します。平均点を小数第1位まで表示したいときは round() の precision を使い、割合をパーセントで表すときは掛け算と組み合わせます。
<?php
$scores = [72, 88, 95, 63, 80];
// 平均点を小数第1位に丸める
$average = round(array_sum($scores) / count($scores), 1);
echo $average; // 79.6
// 達成率をパーセント(整数)で表示
$done = 37;
$goal = 50;
$percent = round($done / $goal * 100);
echo $percent . "%"; // 74%
「あと何個で目標達成か」を切り上げで求めたい、といった在庫・ページ送りの計算でも ceil() が役立ちます。たとえば1ページ10件表示で全37件なら、ceil(37 / 10) で必要なページ数 4 が得られます。
浮動小数点の誤差で丸めがずれるとき
ときどき「四捨五入したはずなのに1つずれる」ことがあります。これは round() のバグではなく、コンピューターが小数を2進数で表す際に生じる誤差が原因です。たとえば 0.285 は内部的にはぴったり 0.285 ではなく、ごくわずかに小さい値として保持されることがあり、その結果 round(0.285, 2) が期待と異なることがあります。
この問題を避けたいときは、計算を「円」ではなく「銭」など整数の最小単位で行うのが確実です。金額なら最初から整数で扱い、表示のときだけ割って小数にすると、誤差の影響をほぼ受けずに済みます。丸めモードを PHP_ROUND_HALF_EVEN に変えることで偏りを減らせる場面もありますが、まずは「小数の計算には誤差が付きもの」という前提を知っておくことが大切です。
number_format との違い
桁数を指定して丸められる点で round() と number_format() は似ていますが、目的が異なります。round() が計算に使える数値を返すのに対し、number_format() は桁区切りのカンマを付けた表示用の文字列を返します。金額をそのまま画面に出すなら number_format()、丸めた値を使って計算を続けるなら round()、と使い分けるとよいでしょう。
まとめ
数値の丸めに使う4つの関数を整理します。
round()は四捨五入。第2引数precisionで桁数を指定でき、負の桁で10・100単位の丸めもできる。第3引数で丸めモードを変えられる。ceil()は切り上げ、floor()は切り捨て。負の数では向きに注意する。abs()は絶対値。渡した型(int/float)を保つ。round()・ceil()・floor()の戻り値は float。整数で使いたいときは(int)でキャストする。- 小数計算には浮動小数点の誤差が付きもの。金額は整数の最小単位で扱うと安全。
消費税や平均、割合の計算では、どの丸め方が要件に合うかを最初に決めてから関数を選ぶのがコツです。まずは round()・ceil()・floor() の違いを手元で試して、戻り値の型まで var_dump() で確認してみてください。