- カテゴリ: PHP
- 掲載バージョン: PHP 8.4
- 名前空間 / FQCN / コマンド:
floor(float $num): float - 関連: ceil / round / intdiv / fmod
- 変更履歴: PHP 8.x での仕様変更なし
要点(TL;DR)
- 数値を小さい方向へ丸める(負数はより小さい値へ)
- 最低限の使い方:
$x = floor(3.9); // 3.0 - 罠
floor(-1.2)は-2.0(-1 ではない)- 戻り値は float。整数が欲しいときは
(int) floor(...) - 指定桁での切り捨てはスケールが必要(例:
floor($n*100)/100)
概要
floor() は与えた数値を負方向に丸めた値(切り捨て)を返します。金額計算の「端数切り捨て」や、範囲の下限側に寄せたいときに使います。負数の挙動と、戻り値が float である点を押さえておくと実務での不具合を避けられます。
構文 / シグネチャ
float floor(float $num)
- 引数(表)
| 引数 | 型 | 必須 | 既定値 | 説明 |
|---|---|---|---|---|
| $num | float|int | はい | なし | 切り捨て対象の数値。int も可(内部で float 化) |
- 戻り値:
float(切り捨て後の値) - 例外/副作用:なし(浮動小数の丸め誤差に注意)
使用例
最小例
<?php
declare(strict_types=1);
var_dump(floor(3.9)); // float(3)
var_dump(floor(3.0)); // float(3)
var_dump(floor(-1.2)); // float(-2) ←負方向へ丸め
実務例:税込み金額の1円未満切り捨て
<?php
declare(strict_types=1);
function priceWithTaxFloor(int $price, float $taxRate = 0.10): int
{
// 1円未満を切り捨てる運用例(要件により round/ceil 指定もあり得る)
return (int) floor($price * (1 + $taxRate));
}
echo priceWithTaxFloor(999); // 1098
echo PHP_EOL;
echo priceWithTaxFloor(1234, 0.08); // 1332
小数第2位で切り捨て(例:重量の 2 桁まで)
<?php
declare(strict_types=1);
function floorToDigits(float $value, int $digits): float
{
$scale = 10 ** $digits;
return floor($value * $scale) / $scale;
}
echo floorToDigits(12.349, 2); // 12.34
echo floorToDigits(-1.201, 2); // -1.21(負方向へ)
よくある落とし穴・注意
- 負数の挙動:
floor(-1.2) === -2.0。ゼロ方向ではなく小さい方向に丸める。 - 整数が必要:
floor()は float を返す。整数が必要なら(int) floor(...)。
なお(int)-1.9は -1(ゼロ方向へ切り捨て)で、floor(-1.9)は -2。要件で使い分ける。 - 桁指定は自前スケール:
floor($n, $precision)のような第2引数はありません。$n*10**p→floor→/10**p。 - 浮動小数誤差:
0.1 + 0.2のような計算は誤差あり。金額など厳密さが必要なら BCMath 系 (bcadd,bcdiv) を検討。
代替・関連APIとの比較
- ceil:大きい方向へ丸め。上限側に寄せたいとき。
- round:四捨五入(PHP は 0.5 既定で「偶数丸め」ではなく遠い方へ。
PHP_ROUND_HALF_UP等で制御可)。 - (int) キャスト:ゼロ方向へ切り捨て。負数の結果が
floorと異なる。 - intdiv:整数同士の商(ゼロ方向)。割り算の切り捨て用途では
intdivが速く明確。 - fmod:浮動小数の剰余。端数の抽出に。
選定基準
- 下限寄せ→
floor - 上限寄せ→
ceil - 四捨五入→
round(必要ならモード指定) - 整数割り算→
intdiv - 厳密小数(金額)→ BCMath 検討
テスト例(Pest)
<?php
it('floors positive and negative numbers', function () {
expect(floor(3.9))->toBeFloat()->toBe(3.0);
expect(floor(-1.2))->toBe(-2.0);
expect((int) floor(10.0))->toBe(10);
});
it('floors to given digits with scaling', function () {
$f = fn (float $v, int $d) => floor($v * (10 ** $d)) / (10 ** $d);
expect($f(12.349, 2))->toBe(12.34);
expect($f(-1.201, 2))->toBe(-1.21);
});
トラブルシュート(エラー別)
| 症状/エラー | 原因 | 対処 |
|---|---|---|
期待する -1 が -2 になる | 負数に対する floor の仕様(小さい方向) | ゼロ方向なら (int) や intdiv を使用 |
整数が欲しいのに 3.0 が返る | floor は float を返す | (int) floor(...) にキャスト |
| 指定桁で切り捨てたい | floor に精度指定はない | 10 の冪でスケールして floor 後に戻す |
桁端で想定外(例:12.3400000002) | 浮動小数誤差 | sprintf/number_format で表示調整、または BCMath 系で計算 |
参考リンク
- PHP Manual — floor
https://www.php.net/manual/en/function.floor.php - PHP Manual — ceil / round
https://www.php.net/ceil
https://www.php.net/round - PHP Manual — intdiv / fmod
https://www.php.net/intdiv
https://www.php.net/fmod - PHP Manual — BCMath(高精度演算)
https://www.php.net/book.bc

