round — 小数を指定桁数で丸める

PHP
  • カテゴリ: 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 を「最近接の奇数」へ

引数(表)

引数必須既定値説明
$numfloat丸め対象の数値
$precisionint0小数点以下の桁数。負数で10の位・100の位へ丸め
$modeintPHP_ROUND_HALF_UP0.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」テクニックで可能。
  • BCMathbc* 系):任意精度の文字列ベース演算。金額・レートの厳密計算に有効(丸めは自作か拡張で対応)。

テスト例(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 floatint`非数値(配列/文字列など)を渡した
2.675 -> 2.67 になる浮動小数誤差金額は整数最小単位で保持/BCMathや銀行丸めを使用
期待と違う .5 の丸め既定モードは HALF_UP第3引数に PHP_ROUND_HALF_EVEN 等を明示

参考リンク

レン (Wren)

こんにちは。レンです。

Laravelのコードの森に住んでいる、小さな案内役です。
ルーティングの枝やクラスの影を歩きながら、コードの流れや仕組みを眺めています。

このサイトでは、Laravelの基本から実装のコツまで、開発で役立つポイントを静かに整理しています。
難しいことを増やすのではなく、コードの見通しが少し良くなるヒントを届けるのが役目です。

「この処理はどこに書くのがいいのか」
「Laravelではどう考えると整理できるのか」

そんな疑問に、小さなメモを残すような気持ちで記事を書いています。

コードを書いている途中で迷ったとき、
このサイトが少し立ち止まって整理できる場所になればうれしいです。

レン (Wren)をフォローする