PHPで数値を扱うプログラミングにおいて、割り算は非常に頻繁に行われる演算の一つです。
PHPの標準的な除算演算子である「/」を使用すると、割り切れない場合には自動的に浮動小数点数(float)が返されます。
しかし、ページネーションの計算や、配列のインデックス計算など、計算結果として整数のみが必要なシーンは多々あります。
この記事では、PHPで割り算の商を整数として取得するための最適な手法を、実務で使えるコード例とともに詳しく紹介します。
PHPにおける割り算の基本動作
PHPにおいて、除算演算子(/)を使用した際の挙動を正しく理解しておくことは非常に重要です。
この演算子は、両方の数値が整数であっても、計算結果が割り切れない場合は自動的に浮動小数点数(float)を返します。
まずは、以下のコードで基本的な動作を確認してみましょう。
<?php
$a = 10;
$b = 3;
$result = $a / $b;
var_dump($result); // 結果の型を確認
?>
float(3.3333333333333)
このように、整数同士の計算であっても、結果が小数を含んでしまうことがわかります。
整数としての「商」だけが欲しい場合には、後述するintdiv()関数やキャスト処理を適切に行う必要があります。
推奨:intdiv関数を使用して整数値を取得する
PHP 7以降で推奨されている最もクリーンな方法は、intdiv関数を使用することです。
この関数は、引数として渡された数値を割り算し、余りを切り捨てて整数部分のみを返します。
数学的な「整数の商」を求める際に最も意図が伝わりやすいコードになります。
<?php
$a = 10;
$b = 3;
// intdiv関数を使用して整数の商を取得
$result = intdiv($a, $b);
echo $result;
?>
3
intdiv()を使用するメリットは、計算結果が最初から整数型(int)として扱われる点です。
また、除数(割る数)に0を指定した場合には、DivisionByZeroError例外がスローされるため、エラーハンドリングもしやすいという特徴があります。
キャスト(型変換)による整数化の手法
古くから使われている手法として、計算結果を(int)でキャストする方法があります。
これは「/」演算子で一度浮動小数点数として計算し、その結果の小数点以下を強制的に切り捨てる処理です。
記述が短いため簡便ですが、計算の過程で一度floatを経由する点に注意が必要です。
<?php
$a = 10;
$b = 3;
// 計算結果をint型にキャスト
$result = (int)($a / $b);
echo $result;
?>
3
この方法は非常に高速に動作しますが、負の数が絡む場合に挙動に注意が必要です。
正の数の場合は「切り捨て」となりますが、厳密には「0の方向に向かって丸める」という動作になります。
floor関数やround関数との使い分け
単なる商の取得ではなく、計算結果をどう丸めたいかによって、数学関数を使い分ける場合もあります。
特にfloor関数は「元の値を超えない最大の整数」を返すため、正の数ではintdiv()と同じ結果になりますが、負の数では異なる挙動を示します。
| 関数・手法 | 正の数の計算 (10 / 3) | 負の数の計算 (-10 / 3) | 主な用途 |
|---|---|---|---|
intdiv() | 3 | -3 | 純粋な整数の商が欲しい時 |
(int) キャスト | 3 | -3 | 記述を簡略化したい時 |
floor() | 3 | -4 | 常に小さい方の整数へ丸めたい時 |
ceil() | 4 | -3 | 常に大きい方の整数へ切り上げたい時 |
例えば、ページネーションで全ページ数を計算するような場合は、あまりがあればページを増やす必要があるため、ceil()(切り上げ)がよく使われます。
一方で、単純に「何セット作れるか」を計算する場合には、intdiv()やfloor()が適しています。
負の数が含まれる場合の注意点
割り算の対象に負の数が含まれる場合、intdiv()と数学関数の違いが顕著に現れます。
プログラムのロジックにおいて、「0に近い方へ丸める」のか「数直線上で左側へ丸める」のかを明確にする必要があります。
<?php
$val1 = -10;
$val2 = 3;
echo intdiv($val1, $val2); // 結果: -3
echo "\n";
echo floor($val1 / $val2); // 結果: -4
?>
-3
-4
多くのビジネスロジックでは、単純な「商」を求めるintdiv()の挙動(-3)が求められることが多いでしょう。
しかし、座標計算や特定のアルゴリズムではfloor()の挙動が必要になることもあるため、要件に合わせて選択してください。
まとめ
PHPで割り算の商を整数で取得するには、いくつかの方法がありますが、現在の開発シーンではintdiv関数の利用が最も推奨されます。
intdiv()はコードの可読性を高めるだけでなく、型定義が明確になり、予期せぬ浮動小数点数の誤差を避けることができます。
一方で、特定の丸め処理が必要な場合にはfloor()やceil()を、ごく簡易的な処理であればキャストを利用するなど、状況に応じた使い分けが大切です。
それぞれの挙動の違い、特に負の数を扱う際の動作を正しく把握して、バグのないプログラミングを心がけましょう。
