[PHP]floor関数完全ガイド – 数値の切り捨て処理をマスターしよう

PHP

PHPでよく使われる数学関数の一つであるfloor()関数について、基本から応用まで詳しく解説します。

floor関数の基本

floor()関数は、指定された数値を切り捨てて、その数値以下の最大の整数を返します。つまり、小数点以下を切り捨てる関数です。

基本構文

float floor ( float $number )

基本的な使用例

<?php
echo floor(4.3);    // 出力: 4
echo floor(9.999);  // 出力: 9
echo floor(-3.14);  // 出力: -4(注意: 負の数では小さい方向に切り捨て)

負の数の場合は、切り捨ては小さい方向(数直線上で左方向)に行われるため、結果は常に引数以下の最大の整数になります。

実践的な使用例

例1: 価格計算での使用

<?php
$price = 1256.78;
$discount_price = $price * 0.85;  // 15%オフ

echo "元の価格: " . number_format($price, 2) . "円\n";
echo "割引価格(切り捨てなし): " . number_format($discount_price, 2) . "円\n";
echo "割引価格(切り捨て): " . number_format(floor($discount_price), 2) . "円\n";

出力:

元の価格: 1,256.78円
割引価格(切り捨てなし): 1,068.26円
割引価格(切り捨て): 1,068.00円

例2: ページネーションでの使用

<?php
$total_items = 57;
$items_per_page = 10;
$total_pages = floor($total_items / $items_per_page) + 1;

echo "アイテム総数: $total_items\n";
echo "1ページあたりのアイテム数: $items_per_page\n";
echo "合計ページ数: $total_pages";

出力:

アイテム総数: 57
1ページあたりのアイテム数: 10
合計ページ数: 6

他の関連関数との比較

ceil()との比較(切り上げ)

<?php
$number = 4.3;
echo "元の数値: $number\n";
echo "floor()結果: " . floor($number) . "\n";  // 4
echo "ceil()結果: " . ceil($number);          // 5

round()との比較(四捨五入)

<?php
$numbers = [2.3, 2.5, 2.7, -2.3, -2.5, -2.7];

foreach ($numbers as $number) {
    echo "数値: $number\n";
    echo "  floor(): " . floor($number) . "\n";
    echo "  round(): " . round($number) . "\n";
    echo "  ceil(): " . ceil($number) . "\n\n";
}

特殊なケースと注意点

浮動小数点の精度問題

<?php
$calculation = 10.1 + 0.7;
echo "計算結果: $calculation\n";           // 10.8 に近い値
echo "floor()結果: " . floor($calculation); // 通常は10

// より安全な方法
$calculation = 10.1 + 0.7;
$calculation = round($calculation, 10);  // 小数点以下を適切な桁数で丸める
echo "丸めた計算結果: $calculation\n";
echo "floor()結果: " . floor($calculation);

大きな数値の取り扱い

<?php
$big_number = 1234567890123.456789;
echo "大きな数値: $big_number\n";
echo "floor()結果: " . floor($big_number);

// 精度が必要な場合はBCMath関数を使用する
if (function_exists('bcfloor')) {
    echo "bcfloor()結果: " . bcfloor($big_number);
} else {
    // BCMathでfloorを模倣
    echo "BCMath floor結果: " . bcsub($big_number, bcmod($big_number, 1), 0);
}

実践的なユースケース

例3: 割引計算の完全版

<?php
function calculate_discount($price, $discount_percent, $min_price = null) {
    $discount_price = $price * (1 - $discount_percent / 100);
    $discount_price = floor($discount_price);

    // 最低価格が設定されている場合はチェック
    if ($min_price !== null && $discount_price < $min_price) {
        return $min_price;
    }

    return $discount_price;
}

$products = [
    ['name' => 'ノートPC', 'price' => 89800],
    ['name' => 'スマートフォン', 'price' => 65000],
    ['name' => 'イヤホン', 'price' => 12800]
];

foreach ($products as $product) {
    $original = $product['price'];
    $sale_price = calculate_discount($original, 15, 10000);
    echo "{$product['name']} の価格:\n";
    echo "  通常価格: " . number_format($original) . "円\n";
    echo "  セール価格: " . number_format($sale_price) . "円\n";
    echo "  割引額: " . number_format($original - $sale_price) . "円\n\n";
}

まとめ

floor()関数は、PHP開発において以下のような場面で特に役立ちます:

  1. 価格計算(消費者にとって有利な切り捨て)
  2. ページネーション計算
  3. 数学的計算での整数部分の抽出
  4. 切り捨てが必要な統計計算

使用する際は、特に浮動小数点の精度問題や負の数の挙動に注意して、適切なコンテキストで利用することが重要です。

タイトルとURLをコピーしました