整数同士の割り算 / が小数になる(整数除算ではない)
PHPの / 演算子は割り切れるかどうかに関わらず、割り切れない場合は自動的に小数(float)を返します。整数の商だけが欲しい場合はintdiv()を使う必要があります。
なぜエラーが出ないのか
出力: 3.3333333333333
(エラーなし)- PHPは何も報告しません。文法として正しいためです
出力: 3.3333333333333- 実際の挙動 — 期待した結果と食い違っている箇所
見つけ方- エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます
このエラーが出る典型パターン
パターン1
1 <?php 2 echo 10 / 3; ^
出力: 3.3333333333333期待: 2 (エラーにはなりません)
10を3で割ると割り切れないため、/演算子は自動的に小数を返します。割り切れる数に直すか、整数の商が欲しい場合はintdiv()を使う必要があります。
直し方: 3 を 5 にします。
広告
広告スロット(未設定)
パターン2
1 <?php 2 $total = 7; 3 $people = 2; ^ 4 echo $total / $people;
出力: 3.5期待: 7 (エラーにはなりません)
7 / 2は割り切れないため小数になります。整数の商を期待するなら、割る数か演算方法を見直す必要があります。
直し方: 2 を 1 にします。
パターン3
1 <?php 2 $minutes = 100; 3 $hours = $minutes / 60 ; ^ 4 echo $hours;
出力: 1.6666666666667期待: 1 (エラーにはなりません)
/演算子は小数を返すため、時間の商のような整数値が欲しい場面ではintdiv()を使う必要があります。
直し方: $minutes / 60 を intdiv($minutes, 60) にします。
よくある誤解
「整数同士の割り算だから結果も整数になるはず」という、C・Javaなど静的型付け言語の感覚は通用しません。PHPの/は常に正確な商を返そうとするため、割り切れなければfloatになります。
まとめ
整数同士の割り算 / が小数になる(整数除算ではない)は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。