- カテゴリ: 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 

  
  
  
  