PHPでの割り算の切り捨てについて

採用はこちら

PHPで割り算の結果を切り捨てたい場合は、主に次の方法を使います。

floor($a / $b);
intdiv($a, $b);
(int)($a / $b);

どれも「割り算の結果を整数のように扱う」ために使えますが、挙動は同じではありません。

特に、正の数だけを扱う場合と、負の数を扱う場合では結果が変わることがあります。

また、floor() は整数のような値を返しますが、戻り値の型は float です。

そのため、PHPで割り算の結果を切り捨てるときは、目的に合わせて方法を選ぶことが大切です。

目次

PHPの割り算は「/」を使う

PHPで通常の割り算を行う場合は、/ 演算子を使います。

echo 10 / 3;

実行結果は次のようになります。

3.3333333333333

10 ÷ 3 は割り切れないため、小数を含む結果になります。

一方、割り切れる場合は、整数として返されることがあります。

var_dump(10 / 2);
var_dump(10 / 3);

実行結果は次のようになります。

int(5)
float(3.3333333333333)

PHPの / 演算子は、割り算を行うための演算子です。

割り切れない場合は float になりますが、両方の値が整数で割り切れる場合は int になることがあります。

ただし、割り算の結果を必ず整数として扱いたい場合は、/ の結果に任せるのではなく、intdiv()floor()(int) キャストなどを使って明示的に処理するのが安全です。

PHPで割り算を切り捨てる主な方法

PHPで割り算の結果を切り捨てる方法には、主に次の3つがあります。

floor($a / $b);
intdiv($a, $b);
(int)($a / $b);

それぞれの特徴を整理すると、次のようになります。

方法結果戻り値の型特徴
floor($a / $b)floor(10 / 3)3float小さい方向へ丸める
intdiv($a, $b)intdiv(10, 3)3int整数除算の商を返す
(int)($a / $b)(int)(10 / 3)3int0に近い方向へ丸める

正の数だけを扱う場合は、どの方法でも似た結果になることが多いです。

しかし、負の数を扱う場合は結果が異なるため注意が必要です。

floor()で割り算の結果を切り捨てる

floor() は、指定した数値以下の最大の整数に丸める関数です。

正の数であれば、小数点以下を切り捨てる処理として使えます。

$result = floor(10 / 3);

echo $result;

実行結果は次の通りです。

3

10 / 33.333... です。

floor() を使うことで、3 に丸められます。

floor()の基本構文

floor() の基本的な書き方は次の通りです。

floor(数値)

割り算と組み合わせる場合は、次のように書きます。

floor($num1 / $num2);

たとえば、17 ÷ 5 の結果を切り捨てる場合は次のように書きます。

$num1 = 17;
$num2 = 5;

$result = floor($num1 / $num2);

echo $result;

実行結果は次のようになります。

3

17 / 53.4 です。

floor() によって、結果は 3 になります。

floor()は戻り値がfloatになる

floor() を使うと、見た目は整数のような値になります。

しかし、戻り値の型は int ではなく float です。

$result = floor(10 / 3);

var_dump($result);

実行結果は次のようになります。

float(3)

表示上は 3 でも、型としては float です。

整数型として扱いたい場合は、次のようにキャストします。

$result = (int) floor(10 / 3);

var_dump($result);

実行結果は次のようになります。

int(3)

配列の添字、件数、ページ番号など、明確に整数として扱いたい場面では、必要に応じて (int) を使うとよいでしょう。

intdiv()で整数除算する

PHPで整数同士の割り算を行い、商だけを整数で取得したい場合は intdiv() が便利です。

$result = intdiv(10, 3);

echo $result;

実行結果は次の通りです。

3

10 ÷ 3 は、商が 3、余りが 1 です。

intdiv() は、この商の部分だけを返します。

intdiv()の基本構文

intdiv() の基本構文は次の通りです。

intdiv(割られる数, 割る数)

たとえば、17 ÷ 5 の商を求める場合は次のように書きます。

$num1 = 17;
$num2 = 5;

$result = intdiv($num1, $num2);

echo $result;

実行結果は次のようになります。

3

17 ÷ 5 は、商が 3、余りが 2 です。

intdiv() は、余りを除いた商だけを返します。

intdiv()は戻り値がintになる

floor() とは異なり、intdiv() の戻り値は int です。

$result = intdiv(10, 3);

var_dump($result);

実行結果は次のようになります。

int(3)

最初から整数型の結果がほしい場合は、intdiv() がわかりやすい方法です。

intdiv()は整数除算用の関数

intdiv() は整数除算用の関数です。

そのため、引数には整数を渡すのが基本です。

echo intdiv(10, 3);

実行結果は次の通りです。

3

一方で、小数を含む値を扱いたい場合は、intdiv() よりも floor() を使うほうが自然です。

echo floor(10.5 / 3);

このように、小数を含む計算結果を切り捨てたい場合は、floor() を使うとわかりやすいです。

floor()とintdiv()の違い

floor()intdiv() は、正の数だけを扱う場合は似た結果になります。

echo floor(10 / 3);
echo "\n";
echo intdiv(10, 3);

実行結果は次のようになります。

3
3

しかし、負の数を扱う場合は結果が異なります。

正の数の場合

正の数では、floor()intdiv() の結果は同じになることが多いです。

echo floor(17 / 5);
echo "\n";
echo intdiv(17, 5);

実行結果は次のようになります。

3
3

17 / 53.4 です。

どちらも結果は 3 になります。

負の数の場合

負の数では、floor()intdiv() の結果が変わることがあります。

echo floor(-10 / 3);
echo "\n";
echo intdiv(-10, 3);

実行結果は次のようになります。

-4
-3

-10 / 3-3.333... です。

floor() は、その値以下の最大の整数に丸めます。

そのため、-3.333... より小さい整数である -4 になります。

一方、intdiv() は整数除算の商を返します。

負の数を含む場合は、0に近い方向へ丸めた結果になります。

そのため、intdiv(-10, 3)-3 になります。

floor()は小さい方向へ丸める

floor() は、単純に「小数点以下を消す」と考えると、負の数で誤解しやすい関数です。

echo floor(3.8);
echo "\n";
echo floor(-3.8);

実行結果は次のようになります。

3
-4

正の数では、小数点以下を切り捨てたように見えます。

しかし、負の数ではより小さい整数に丸められます。

つまり、floor(-3.8)-3 ではなく -4 です。

intdiv()は0に近い方向へ丸める

intdiv() は、整数除算の商を返します。

echo intdiv(10, 3);
echo "\n";
echo intdiv(-10, 3);
echo "\n";
echo intdiv(10, -3);
echo "\n";
echo intdiv(-10, -3);

実行結果は次のようになります。

3
-3
-3
3

負の数を扱う場合、floor() とは結果が異なることがあります。

「より小さい方向へ丸めたい」のか、「整数除算の商を求めたい」のかを意識して使い分けましょう。

(int)キャストで割り算の結果を整数にする

割り算の結果を (int) でキャストする方法もあります。

$result = (int)(10 / 3);

echo $result;

実行結果は次の通りです。

3

10 / 33.333... です。

これを int に変換することで、結果は 3 になります。

(int)キャストの基本例

echo (int)(17 / 5);

実行結果は次のようになります。

3

17 / 53.4 です。

(int) に変換されることで、3 になります。

(int)キャストは0に近い方向へ丸める

(int) によるキャストは、floor() とは異なります。

echo (int)(-10 / 3);
echo "\n";
echo floor(-10 / 3);

実行結果は次のようになります。

-3
-4

(int) キャストは、floatint に変換するときに0に近い方向へ丸めます。

正の数では、小数点以下を切り捨てたように見えます。

echo (int)3.8;

実行結果は次のようになります。

3

しかし、負の数では結果が変わります。

echo (int)-3.8;

実行結果は次のようになります。

-3

一方、floor(-3.8)-4 です。

echo floor(-3.8);

実行結果は次のようになります。

-4

そのため、負の数を扱う可能性がある場合は、floor()(int) キャストの違いに注意しましょう。

割り算の余りを求める場合は%を使う

割り算の商だけでなく、余りを求めたい場合は % を使います。

echo 10 % 3;

実行結果は次の通りです。

1

10 ÷ 3 は、商が 3、余りが 1 です。

整数の商を求める場合は intdiv()、余りを求める場合は % を使うとわかりやすいです。

$num1 = 10;
$num2 = 3;

$quotient = intdiv($num1, $num2);
$remainder = $num1 % $num2;

echo "商: " . $quotient . "\n";
echo "余り: " . $remainder;

実行結果は次のようになります。

商: 3
余り: 1

なお、% は整数の余りを求める演算子です。

小数の余りを扱いたい場合は、用途に応じて fmod() の利用を検討します。

小数点以下の桁数を指定して切り捨てる方法

整数にするのではなく、小数第2位まで残して、それ以降を切り捨てたい場合もあります。

たとえば、次のような数値があるとします。

3.14159

これを小数第2位まで残すと、次のようになります。

3.14

このような場合は、倍率をかけて floor() し、最後に元に戻します。

小数第2位まで切り捨てる例

$value = 3.14159;

$result = floor($value * 100) / 100;

echo $result;

実行結果は次の通りです。

3.14

考え方は次の通りです。

3.14159 * 100 = 314.159
floor(314.159) = 314
314 / 100 = 3.14

小数第2位まで残したい場合は、100 を使います。

割り算の結果を小数第2位まで切り捨てる例

$num1 = 10;
$num2 = 3;

$result = floor(($num1 / $num2) * 100) / 100;

echo $result;

実行結果は次のようになります。

3.33

10 / 33.333... です。

小数第2位まで残して、それ以降を切り捨てると 3.33 になります。

小数第3位まで切り捨てる例

小数第3位まで残したい場合は、1000 を使います。

$value = 3.14159;

$result = floor($value * 1000) / 1000;

echo $result;

実行結果は次のようになります。

3.141

残したい小数の桁数に応じて、次のように倍率を変えます。

残したい桁数計算に使う倍率
小数第1位まで10
小数第2位まで100
小数第3位まで1000
小数第4位まで10000

ただし、PHPの小数は浮動小数点数として扱われるため、計算内容によってはわずかな誤差が出る場合があります。

金額計算など厳密さが必要な処理では、できるだけ整数に直して計算する方法も検討しましょう。

round()は切り捨てではなく丸め処理

PHPには round() という関数もあります。

round() は切り捨て専用の関数ではなく、指定した桁数に丸めるための関数です。

通常は、四捨五入のような丸め処理として使われます。

echo round(10 / 3);

実行結果は次のようになります。

3

この例だけを見ると、切り捨てと同じように見えるかもしれません。

しかし、次の例では結果が変わります。

echo floor(10 / 6);
echo "\n";
echo round(10 / 6);

実行結果は次のようになります。

1
2

10 / 61.666... です。

floor() は小さい方向へ丸めるため、結果は 1 です。

一方、round() は丸め処理を行うため、結果は 2 になります。

そのため、切り捨てが目的であれば、基本的には round() ではなく floor()intdiv() を使います。

ceil()は切り上げに使う

ceil() は切り上げに使う関数です。

echo ceil(10 / 3);

実行結果は次のようになります。

4

10 / 33.333... です。

ceil() を使うと、結果は 4 になります。

floor() が小さい方向へ丸める関数であるのに対し、ceil() は大きい方向へ丸める関数です。

実務でよくある使い方

PHPで割り算の切り捨てを使う場面は多くあります。

ここでは、実務でよくある例を紹介します。

ページネーションで総ページ数を求める場合

ページネーションでは、総件数を1ページあたりの件数で割って、総ページ数を計算することがあります。

この場合、一般的には切り捨てではなく、切り上げを使います。

$totalItems = 53;
$perPage = 10;

$totalPages = ceil($totalItems / $perPage);

echo $totalPages;

実行結果は次の通りです。

6

53件を10件ずつ表示する場合、5ページでは50件までしか表示できません。

残り3件を表示するために、6ページ目が必要です。

そのため、総ページ数を求める場合は、floor() ではなく ceil() を使うことが多いです。

実務では、$perPage0 にならないように確認することも大切です。

$totalItems = 53;
$perPage = 10;

if ($perPage <= 0) {
    echo "1ページあたりの件数は1以上にしてください。";
} else {
    $totalPages = ceil($totalItems / $perPage);
    echo $totalPages;
}

グループ分けで商を求める場合

たとえば、10個の商品を3個ずつ箱に入れるとします。

このとき、満杯になる箱の数だけを求めたい場合は intdiv() が便利です。

$items = 10;
$boxSize = 3;

$fullBoxes = intdiv($items, $boxSize);

echo $fullBoxes;

実行結果は次のようになります。

3

3個入りの箱は3箱作れます。

余りは % で求めます。

$items = 10;
$boxSize = 3;

$fullBoxes = intdiv($items, $boxSize);
$remainder = $items % $boxSize;

echo "満杯の箱: " . $fullBoxes . "\n";
echo "余り: " . $remainder;

実行結果は次のようになります。

満杯の箱: 3
余り: 1

整数の商と余りを扱う場合は、intdiv()% を組み合わせるとわかりやすいです。

金額計算で小数を切り捨てる場合

消費税や割引率などの計算では、小数点以下を切り捨てる処理が必要になることがあります。

$price = 1980;
$taxRate = 0.10;

$tax = floor($price * $taxRate);

echo $tax;

実行結果は次のようになります。

198

この例では、1980 × 0.10 の結果が 198 になるため、税額は 198 です。

ただし、金額計算では端数処理のルールが重要です。

切り捨てにするのか、切り上げにするのか、四捨五入にするのかは、サービスや業務上のルールによって異なります。

また、商品ごとに端数処理するのか、合計金額に対して端数処理するのかによっても結果が変わる場合があります。

そのため、金額計算では処理を書く前に、端数処理のルールを確認することが大切です。

0で割らないように注意する

割り算では、割る数が 0 にならないように注意が必要です。

$result = 10 / 0;

このような処理はエラーの原因になります。

intdiv() でも同様です。

$result = intdiv(10, 0);

intdiv() では、割る数に 0 を指定すると DivisionByZeroError が発生します。

そのため、変数を使って割り算する場合は、事前に 0 でないか確認しましょう。

$num1 = 10;
$num2 = 0;

if ($num2 !== 0) {
    $result = floor($num1 / $num2);
    echo $result;
} else {
    echo "0で割ることはできません。";
}

実務で使いやすい関数にする例

割り算の結果を切り捨てる処理を何度も使う場合は、関数にしておくと便利です。

function divideFloor($num1, $num2) {
    if ($num2 == 0) {
        return null;
    }

    return floor($num1 / $num2);
}

echo divideFloor(10, 3);

実行結果は次のようになります。

3

ただし、floor() の戻り値は float です。

整数として返したい場合は、次のように (int) を付けます。

function divideFloorAsInt($num1, $num2) {
    if ($num2 == 0) {
        return null;
    }

    return (int) floor($num1 / $num2);
}

echo divideFloorAsInt(10, 3);

実行結果は次のようになります。

3

null を返す設計にした場合は、呼び出し側で結果を確認します。

$result = divideFloorAsInt(10, 0);

if ($result === null) {
    echo "計算できません。";
} else {
    echo $result;
}

用途別の使い分け

PHPで割り算の結果を切り捨てたい場合は、目的に応じて使い分けるとわかりやすいです。

やりたいことおすすめの方法
小数点以下を小さい方向へ丸めたいfloor($a / $b)
整数同士の割り算で商だけほしいintdiv($a, $b)
結果を int 型で取得したいintdiv() または (int) floor($a / $b)
0に近い方向へ丸めたい(int)($a / $b)
小数第2位まで残して切り捨てたいfloor(($a / $b) * 100) / 100
四捨五入のように丸めたいround($a / $b)
切り上げたいceil($a / $b)

PHPで割り算を切り捨てるときの注意点

PHPで割り算を切り捨てるときは、いくつか注意したいポイントがあります。

負の数では結果が変わる

floor()intdiv()(int) キャストは、負の数を扱うと結果が変わる場合があります。

echo floor(-10 / 3);
echo "\n";
echo intdiv(-10, 3);
echo "\n";
echo (int)(-10 / 3);

実行結果は次のようになります。

-4
-3
-3

floor() は小さい方向へ丸めます。

intdiv()(int) キャストは、0に近い方向へ丸める結果になります。

正の数だけを扱う場合は違いが出にくいですが、負の数を扱う可能性がある場合は注意が必要です。

floor()はintではなくfloatを返す

floor() の結果は整数のように見えても、型は float です。

var_dump(floor(10 / 3));

実行結果は次のようになります。

float(3)

int 型として使いたい場合は、次のようにキャストします。

$result = (int) floor(10 / 3);

小数計算では誤差に注意する

PHPの小数は浮動小数点数として扱われます。

そのため、計算内容によっては、わずかな誤差が出ることがあります。

特に、金額計算など厳密さが必要な処理では注意が必要です。

たとえば、税率や割引率の計算では、次のように小数を使うことがあります。

$price = 1999;
$rate = 0.08;

$result = floor($price * $rate);

このような計算自体はよく使われますが、金額を扱う場合は、端数処理のルールや計算単位を明確にしておくことが大切です。

できるだけ整数で扱える設計にすると、誤差を避けやすくなります。

まとめ

PHPで割り算の結果を切り捨てる場合は、主に floor()intdiv()(int) キャストを使います。

小数を含む割り算の結果を小さい方向へ丸めたい場合は、次のように書きます。

floor($a / $b);

整数同士の割り算で商だけを取得したい場合は、次のように書きます。

intdiv($a, $b);

割り算の結果を int 型に変換したい場合は、次のように書けます。

(int)($a / $b);

ただし、これらは同じ処理ではありません。

floor() は小さい方向へ丸めるため、負の数では -4 のようにより小さい整数になります。

一方、intdiv()(int) キャストは、0に近い方向へ丸める結果になります。

また、floor() の戻り値は float であり、intdiv() の戻り値は int です。

PHPで割り算の結果を切り捨てるときは、単に「小数点以下をなくしたい」と考えるだけでなく、戻り値の型負の数の扱い0除算小数計算の誤差にも注意して、目的に合った方法を選びましょう。

以上、PHPでの割り算の切り捨てについてでした。

最後までお読みいただき、ありがとうございました。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!
目次