floor — 小数点以下を切り捨てる

PHP
  • カテゴリ: 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)
  • 引数(表)
引数必須既定値説明
$numfloat|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**pfloor/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 が返るfloorfloat を返す(int) floor(...) にキャスト
指定桁で切り捨てたいfloor に精度指定はない10 の冪でスケールして floor 後に戻す
桁端で想定外(例:12.3400000002浮動小数誤差sprintf/number_format で表示調整、または BCMath 系で計算

参考リンク

長野県・北アルプス地方在住のフリーランスWebプログラマー。
「落ち着くためのWeb開発」をテーマに、訪れる人が安心して使えるサービスづくりを心がけています。

LaravelやWordPressなどのWebアプリケーション開発を得意とし、技術面の安定性はもちろん、運用後も長く活用できる設計を大切にしています。
静かな山間の暮らしから生まれる視点で、シンプルかつ本質的な解決策をご提案します。

野鳥観察も趣味のひとつで、特にミソサザイ(Wren)に魅力を感じています。
小さな体に反して力強く上向きの尾羽、そして澄んだ鳴き声が遠くまで響く姿に、静かな存在感と芯の強さを感じます。
このサイト名「Laravel Wren」には、そんなミソサザイのように、小さくても確かな価値を届けたいという想いを込めています。

信頼できるパートナーとして、そして気軽に相談できる存在として、あなたのWebプロジェクトをサポートします。

Yudai Tsuyuzakiをフォローする