整数同士の割り算 / が小数になる(整数除算ではない)
PHPの / 演算子は割り切れるかどうかに関わらず、割り切れない場合は自動的に小数(float)を返します。整数の商だけが欲しい場合はintdiv()を使う必要があります。
なぜエラーが出ないのか
出力: 3.3333333333333
(エラーなし)- PHPは何も報告しません。文法として正しいためです
出力: 3.3333333333333- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 <?php 2 echo 10 / 3; ^
10を3で割ると割り切れないため、/演算子は自動的に小数を返します。割り切れる数に直すか、整数の商が欲しい場合はintdiv()を使う必要があります。
直し方: 3 を 5 にします。
パターン2
1 <?php 2 $total = 7; 3 $people = 2; ^ 4 echo $total / $people;
7 / 2は割り切れないため小数になります。整数の商を期待するなら、割る数か演算方法を見直す必要があります。
直し方: 2 を 1 にします。
パターン3
1 <?php 2 $minutes = 100; 3 $hours = $minutes / 60 ; ^ 4 echo $hours;
/演算子は小数を返すため、時間の商のような整数値が欲しい場面ではintdiv()を使う必要があります。
直し方: $minutes / 60 を intdiv($minutes, 60) にします。
パターン4
1 <?php 2 echo 20 / 6; ^
20を6で割ると割り切れないため、/演算子は自動的に小数を返します。
直し方: 6 を 4 にします。
パターン5
1 <?php 2 $total = 50; 3 $boxes = 8; 4 echo $total / $boxes ; ^
/演算子は小数を返すため、整数の商が欲しい場面ではintdiv()を使う必要があります。
直し方: $total / $boxes を intdiv($total, $boxes) にします。
よくある誤解
「整数同士の割り算だから結果も整数になるはず」という、C・Javaなど静的型付け言語の感覚は通用しません。PHPの/は常に正確な商を返そうとするため、割り切れなければfloatになります。
実務での勘所
整数同士の割り算の扱いは言語ごとに派閥があります。C、C++、Java、C#は int / int を int のまま(切り捨て)にする一方、PHP、Python 3、JavaScriptは常に正確な商(必要なら小数)を返す設計を選んでいます。PHPで切り捨てた整数の商だけが欲しい場合は、intdiv()という専用の関数を明示的に呼ぶ必要があります。「/」という同じ記号でも、言語によってどちらの派閥に属するかで挙動が変わるという点を覚えておくと、複数の言語を行き来するときに役立ちます。