PHPで数値を扱うプログラミングにおいて、割り算は非常に頻繁に行われる演算の一つです。

PHPの標準的な除算演算子である「/」を使用すると、割り切れない場合には自動的に浮動小数点数(float)が返されます。

しかし、ページネーションの計算や、配列のインデックス計算など、計算結果として整数のみが必要なシーンは多々あります。

この記事では、PHPで割り算の商を整数として取得するための最適な手法を、実務で使えるコード例とともに詳しく紹介します。

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

PHPにおいて、除算演算子(/)を使用した際の挙動を正しく理解しておくことは非常に重要です。

この演算子は、両方の数値が整数であっても、計算結果が割り切れない場合は自動的に浮動小数点数(float)を返します。

まずは、以下のコードで基本的な動作を確認してみましょう。

PHP
<?php
$a = 10;
$b = 3;

$result = $a / $b;
var_dump($result); // 結果の型を確認
?>
実行結果
float(3.3333333333333)

このように、整数同士の計算であっても、結果が小数を含んでしまうことがわかります。

整数としての「商」だけが欲しい場合には、後述するintdiv()関数やキャスト処理を適切に行う必要があります。

推奨:intdiv関数を使用して整数値を取得する

PHP 7以降で推奨されている最もクリーンな方法は、intdiv関数を使用することです。

この関数は、引数として渡された数値を割り算し、余りを切り捨てて整数部分のみを返します。

数学的な「整数の商」を求める際に最も意図が伝わりやすいコードになります。

PHP
<?php
$a = 10;
$b = 3;

// intdiv関数を使用して整数の商を取得
$result = intdiv($a, $b);

echo $result;
?>
実行結果
3

intdiv()を使用するメリットは、計算結果が最初から整数型(int)として扱われる点です。

また、除数(割る数)に0を指定した場合には、DivisionByZeroError例外がスローされるため、エラーハンドリングもしやすいという特徴があります。

キャスト(型変換)による整数化の手法

古くから使われている手法として、計算結果を(int)でキャストする方法があります。

これは「/」演算子で一度浮動小数点数として計算し、その結果の小数点以下を強制的に切り捨てる処理です。

記述が短いため簡便ですが、計算の過程で一度floatを経由する点に注意が必要です。

PHP
<?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
<?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()を、ごく簡易的な処理であればキャストを利用するなど、状況に応じた使い分けが大切です。

それぞれの挙動の違い、特に負の数を扱う際の動作を正しく把握して、バグのないプログラミングを心がけましょう。