PHPで数値を割ったときの余りを取得する処理は、プログラミングにおいて非常に頻繁に利用される基本的な計算の一つです。
数値が偶数か奇数かを判定したり、ループ処理の中で特定の回数ごとに改行を挿入したりするなど、その用途は多岐にわたります。
PHPには余りを求めるための専用の演算子や関数が用意されていますが、扱う数値の型や符号によって結果が異なる場合があります。
この記事では、剰余演算子「%」の基本的な使い方から、実戦で役立つ応用テクニック、さらには注意すべき計算の仕様について詳しく解説します。
剰余演算子「%」を使った基本的な計算方法
PHPで割り算の余り(剰余)を求めるには、算術演算子の一つである「%」を使用します。
この演算子は「左側の値を右側の値で割ったときの余り」を算出するために用いられます。
まずは、最もシンプルなコード例を見てみましょう。
<?php
$a = 10;
$b = 3;
// 10を3で割った余りを計算する
$result = $a % $b;
echo $result;
?>
1
上記の例では、10を3で割ると「3あまり1」となるため、計算結果として1が出力されます。
このように、整数同士の計算において余りを知りたい場合は「%」を使うのが最も一般的です。
剰余演算子が自動で行う型変換の注意点
剰余演算子「%」を利用する際に覚えておくべき重要な仕様として、演算の前に両方の値が「整数(int)」に変換されるという点があります。
例えば、小数を含んだ数値を「%」で計算しようとすると、小数点以下が切り捨てられた状態で計算が実行されます。
<?php
// 小数を含む数値で剰余を計算する
$result = 10.5 % 3.8;
echo $result;
?>
1
この場合、内部的には「10 % 3」として処理されているため、期待した小数の計算結果とは異なる可能性があります。
小数を保持したまま余りを算出したい場合は、後述する専用の関数を使用する必要があります。
小数を含む割り算の余りを求める「fmod」関数
浮動小数点数(小数)を用いて精密な余りを計算したい場合には、「fmod()」関数を使用します。
fmod関数は、第一引数を第二引数で割ったときの余りを「浮動小数点数」として返してくれます。
<?php
$x = 10.5;
$y = 3.2;
// fmod関数を使用して小数の余りを求める
$result = fmod($x, $y);
echo $result;
?>
0.9
10.5の中に3.2は3回入り(9.6)、残りの0.9が正しく返されていることがわかります。
計算の精度が求められる数値処理や、グラフィックの座標計算などでは、剰余演算子ではなくこの関数を活用してください。
負の数を用いた場合の余りの挙動
PHPにおける剰余計算の仕様として、「結果の符号は割られる数(左側の数値)の符号と同じになる」というルールがあります。
これは数学的な定義や他のプログラミング言語とは挙動が異なる場合があるため、特に注意が必要です。
| 計算式 | 結果 | 理由 |
|---|---|---|
10 % 3 | 1 | 左側の10が正の数のため |
-10 % 3 | -1 | 左側の-10が負の数のため |
10 % -3 | 1 | 左側の10が正の数のため(右側の符号は無視される) |
-10 % -3 | -1 | 左側の-10が負の数のため |
右側の数値の符号がプラスであってもマイナスであっても、計算結果には影響しません。
負の数値を扱うロジックを作成する際は、この符号の特性を考慮して条件分岐を設計するようにしましょう。
剰余演算の実践的な活用シーン
割り算の余りを求める処理は、アルゴリズムの構築において非常に強力なツールとなります。
ここでは、実際の開発現場でよく使われる2つの代表的なパターンを紹介します。
1. 偶数・奇数の判定
最も有名な活用方法は、ある数値が偶数か奇数かを判定することです。
「2で割った余りが0なら偶数、1なら奇数」という法則を利用します。
<?php
$numbers = [1, 2, 3, 4, 5];
foreach ($numbers as $num) {
if ($num % 2 === 0) {
echo $num . "は偶数です。";
} else {
echo $num . "は奇数です。";
}
}
?>
1は奇数です。2は偶数です。3は奇数です。4は偶数です。5は奇数です。
2. ループ処理での周期的な実行
Webサイトのリスト表示などで、3項目ごとにデザインを変更したり、特定の場所で改行を入れたりする場合にも役立ちます。
インデックス番号を特定の数で割った余りを確認することで、周期的な処理を実現できます。
<?php
for ($i = 1; $i <= 6; $i++) {
echo $i . "個目のアイテムを出力";
// 3個ごとに改行メッセージを表示
if ($i % 3 === 0) {
echo " (ここで改行)";
}
echo "\n";
}
?>
1個目のアイテムを出力
2個目のアイテムを出力
3個目のアイテムを出力 (ここで改行)
4個目のアイテムを出力
5個目のアイテムを出力
6個目のアイテムを出力 (ここで改行)
「0で割る」エラーへの対策
剰余計算を行う際に絶対に避けなければならないのが、「0による除算(Division by zero)」です。
右側の数値(除数)が0の場合、PHPは致命的なエラー(DivisionByZeroError)をスローします。
<?php
try {
$result = 10 % 0;
} catch (DivisionByZeroError $e) {
echo "エラー:0で割ることはできません。";
}
?>
変数を分母として使用する場合は、事前にその変数が0でないことをチェックするか、例外処理(try-catch)を記述することを推奨します。
ユーザーからの入力値をもとに計算を行うシステムでは、バリデーション(入力チェック)が必須となります。
まとめ
PHPで割り算の余りを求める方法は、用途に応じて使い分けることが重要です。
整数同士の計算であれば「%」演算子を使用し、小数を含んだ精度の高い計算が必要な場合は「fmod()」関数を選びましょう。
また、負の数を使った計算では、割られる数(左側)の符号が結果に反映されるというPHP特有の性質に注意が必要です。
これらの基本を押さえておくことで、偶数判定や周期的なロジックの実装をミスなくスムーズに行えるようになります。
実際のコードを書く際は、0で割るエラーを回避するための対策も忘れずに行い、安全なプログラムを作成してください。
