- カテゴリ: PHP
- 掲載バージョン: PHP 8.4
- 名前空間 / FQCN / コマンド:
round - 関連: floor / ceil / number_format / intdiv / bcmul
- 変更履歴: 目立つ仕様変更なし(PHP 7以降で引数型の厳格化が進み、非数値を渡すと
TypeError)
要点(TL;DR)
- 指定した小数点桁に丸める。負の桁数で10の位/100の位へも丸められる
- 最低限:
round(123.456, 2)→123.46 - 罠: 浮動小数誤差/.5の扱いは
modeで変化/金額はfloat非推奨(整数化やBCMath推奨)
概要
round() は数値を指定した小数点桁数で丸めます。3つ目の引数で「0.5ちょうど」の扱い(丸めモード)を制御できます。実務では金額や歩合率などで頻出ですが、浮動小数点誤差を避けるため、金額計算は整数(最小通貨単位)または任意精度演算を併用します。
構文 / シグネチャ
float round(float $num, int $precision = 0, int $mode = PHP_ROUND_HALF_UP);
// 丸めモード定数
// PHP_ROUND_HALF_UP : 0.5 を「大きい方」へ(一般的な四捨五入)
// PHP_ROUND_HALF_DOWN : 0.5 を「小さい方」へ
// PHP_ROUND_HALF_EVEN : 0.5 を「最近接の偶数」へ(銀行丸め)
// PHP_ROUND_HALF_ODD : 0.5 を「最近接の奇数」へ
引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| $num | float | ✅ | — | 丸め対象の数値 |
| $precision | int | 0 | 小数点以下の桁数。負数で10の位・100の位へ丸め | |
| $mode | int | PHP_ROUND_HALF_UP | 0.5の時の丸め規則 |
- 戻り値:
float(丸め後の値。整数に見えても型は float) - 例外/副作用:
TypeError(非数値を渡した場合)。副作用なし
使用例
最小例
<?php
echo round(123.456, 2), PHP_EOL; // 123.46
echo round(123.456), PHP_EOL; // 123
echo round(12345.67, -2), PHP_EOL; // 12300(-2 で100の位)
echo round(1.5, 0, PHP_ROUND_HALF_DOWN), PHP_EOL; // 1(0.5を小さい方へ)
実務例(消費税込の金額を円単位に四捨五入:整数で安全に)
<?php
// 税込(10%)を「円」に四捨五入。浮動小数は使わず、最小単位(厘=1/1000円は仮、ここでは1円未満なし想定)で整数計算。
$priceYen = 199; // 税抜 199円
$taxRate = 10; // 10%
// 「四捨五入」を intdiv で実現:+50 は 100 で割る前の 0.5 加算に相当
$withTax = intdiv($priceYen * (100 + $taxRate) + 50, 100);
echo $withTax, PHP_EOL; // 219
実務例(小数が必要なレートは round で表示用のみに)
<?php
$rate = 0.0333333; // 3.33333%
$calc = 5000 * $rate; // 内部計算
$display = round($rate * 100, 2) . '%'; // 表示は 3.33%
echo $calc, ' (', $display, ')', PHP_EOL;
よくある落とし穴・注意
- 浮動小数誤差:
2.675を 2桁に丸めると期待通りにならないことがある。金額は整数(最小通貨単位)で保持し、必要に応じて表示時のみnumber_format()。 - .5 の扱い:既定は
PHP_ROUND_HALF_UP。金融系はPHP_ROUND_HALF_EVEN(銀行丸め) を使うことがある。 - 負の桁数:
$precision < 0は整数部の桁(10 の位など)に丸める。 - 型:戻りは
float。厳密比較は避け、必要ならabs($a - $b) < 1e-9等で近似比較。 - 非数値:配列や非数値文字列は
TypeError。入力検証や明示キャストを行う。
代替・関連APIとの比較
floor/ceil:常に切り捨て/切り上げ。.5の扱い制御は不可。閾値処理に適合。number_format:表示専用の丸め+フォーマット。計算には不向き。intdiv:整数同士の切り捨て除算。四捨五入は「+除数/2」テクニックで可能。BCMath(bc*系):任意精度の文字列ベース演算。金額・レートの厳密計算に有効(丸めは自作か拡張で対応)。
テスト例(Pest)
<?php
it('rounds to given precision', function () {
expect(round(1.234, 2))->toBe(1.23);
});
it('supports half-even (bankers rounding)', function () {
expect(round(1.5, 0, PHP_ROUND_HALF_EVEN))->toBe(2.0);
expect(round(2.5, 0, PHP_ROUND_HALF_EVEN))->toBe(2.0);
});
it('rounds negative precision to tens/hundreds', function () {
expect(round(149, -1))->toBe(150.0);
expect(round(149, -2))->toBe(100.0);
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
| `TypeError: round(): Argument #1 must be of type float | int` | 非数値(配列/文字列など)を渡した |
2.675 -> 2.67 になる | 浮動小数誤差 | 金額は整数最小単位で保持/BCMathや銀行丸めを使用 |
期待と違う .5 の丸め | 既定モードは HALF_UP | 第3引数に PHP_ROUND_HALF_EVEN 等を明示 |

