PHPで数値計算を行う際、割り算の結果から「商(整数部分)」だけを正確に取得したい場面は多々あります。

PHPの除算演算子である「/」を使用すると、結果が整数であっても浮動小数点数(float)として返される場合があるため注意が必要です。

プログラミングにおいて商を求める方法はいくつか存在し、それぞれ挙動や適したケースが異なります。

本記事では、PHPの標準関数であるintdiv関数や型キャストを用いた、効率的な商の算出方法について詳しく解説します。

PHPにおける割り算の基本動作

PHPで最も一般的な割り算の方法は、除算演算子(/)を使用することです。

しかし、演算子を使用した計算では、割り切れる計算であっても結果が自動的にfloat型になることがあります。

PHP
$result = 10 / 2;
var_dump($result);
実行結果
int(5) または float(5)(PHPのバージョンや環境により挙動が異なる場合があります)

多くのプログラミング言語では「整数同士の割り算は整数を返す」仕様がありますが、PHPでは割り切れない場合に自動で小数点以下が含まれます。

そのため、純粋に「商」だけが必要な場合は、明示的な処理を行う必要があります。

intdiv関数を使用して商を求める

PHP 7から導入されたintdiv関数を使用するのが、商を求める最も安全で確実な方法です。

この関数は第一引数を第二引数で割り、その結果の整数部分のみを返します。

PHP
// 10を3で割った商を取得する
$quotient = intdiv(10, 3);
echo $quotient;
実行結果
3

intdiv関数の大きなメリットは、計算結果が最初から整数型(int)として返される点にあります。

浮動小数点数を経由しないため、精度計算における誤差のリスクを最小限に抑えることが可能です。

intdiv関数が推奨される理由

型キャスト(後述)と比較して、intdiv関数は「割り算の商を求める」という目的がコード上で明確になります。

また、負の数が含まれる計算においても、数学的に予測しやすい挙動を示します。

後からコードを読み返した際に、意図的に整数除算を行っていることが一目で分かるため、保守性の向上にもつながります。

キャスト((int))を使用して商を求める

古くから使われている手法として、通常の割り算の結果を整数型にキャスト(変換)する方法があります。

計算結果を(int)で括ることで、小数点以下を切り捨てて商を取り出します。

PHP
// 割り算の結果をint型にキャストする
$quotient = (int)(10 / 3);
echo $quotient;
実行結果
3

この方法は非常にシンプルであり、intdiv関数が導入される前の古いPHPバージョンでも動作します。

ただし、内部的には一度浮動小数点数の計算が行われているため、非常に巨大な数値を扱う場合には注意が必要です。

intdiv関数とキャストの挙動の違い

一見するとどちらの方法も同じ結果を返しますが、特定の条件下では挙動が異なる場合があります。

特に、割り切れない負の数の計算においてその差が顕著になります。

以下の表は、それぞれの方法で計算した際の戻り値を比較したものです。

計算式(int)($a / $b) の結果intdiv($a, $b) の結果
10 / 333
-10 / 3-3-3
10 / -3-3-3

基本的な商の算出においては大きな差異はありませんが、プログラムの可読性を考慮すると、現代のPHP開発ではintdiv関数の利用が推奨されます。

剰余演算子(%)との組み合わせ

商を求める処理とセットでよく使われるのが、余りを求める「剰余演算子(%)」です。

商と余りの両方を算出することで、データのグループ分けやページネーションの計算に役立ちます。

PHP
$a = 10;
$b = 3;

$quotient = intdiv($a, $b); // 商
$remainder = $a % $b;       // 余り

echo "商: " . $quotient . ", 余り: " . $remainder;
実行結果
商: 3, 余り: 1

このように、intdiv%を組み合わせることで、数値の分配ロジックを簡潔に記述できます。

注意点:ゼロ除算エラーのハンドリング

割り算を行う際に最も注意すべき点は、分母(第二引数)に「0」を指定することです。

PHPでゼロ除算を行うと、DivisionByZeroError例外が発生し、プログラムが停止してしまいます。

PHP
try {
    echo intdiv(10, 0);
} catch (DivisionByZeroError $e) {
    echo "エラー: 0で割ることはできません。";
}
実行結果
エラー: 0で割ることはできません。

ユーザーからの入力値など、動的な数値を分母に使用する場合は、必ず事前に0でないかチェックするか、try-catch文で例外処理を実装してください。

まとめ

PHPで割り算の商を求める際は、PHP 7以降であればintdiv関数を利用するのがベストプラクティスです。

コードの意図が明確になり、浮動小数点数に起因する予期せぬ挙動を防ぐことができます。

一方で、単純な処理や古い環境との互換性を重視する場合は、型キャストを用いた方法も有効な選択肢となります。

それぞれの特性を理解し、プロジェクトの要件に合わせて最適な手法を選択しましょう。

最後に、計算を行う際は常にゼロ除算のリスクを考慮し、適切なエラーハンドリングを行うことを忘れないでください。