Code Fix

初級

整数同士の割り算 / が小数になる(整数除算ではない)

PHPの / 演算子は割り切れるかどうかに関わらず、割り切れない場合は自動的に小数(float)を返します。整数の商だけが欲しい場合はintdiv()を使う必要があります。

なぜエラーが出ないのか

出力: 3.3333333333333
(エラーなし)
PHPは何も報告しません。文法として正しいためです
出力: 3.3333333333333
実際の挙動 — 期待した結果と食い違っている箇所
見つけ方
エラーが出ないので、出力を目で確かめるか、コードを目で追うしかありません。この種の誤りが最も発見が遅れます

このエラーが出る典型パターン

パターン1

 1  <?php
 2  echo 10 / 3;
              ^
出力: 3.3333333333333期待: 2 (エラーにはなりません)

10を3で割ると割り切れないため、/演算子は自動的に小数を返します。割り切れる数に直すか、整数の商が欲しい場合はintdiv()を使う必要があります。

直し方: 35 にします。

この問題を解いてみる →

広告
広告スロット(未設定)

パターン2

 1  <?php
 2  $total = 7;
 3  $people = 2;
              ^
 4  echo $total / $people;
出力: 3.5期待: 7 (エラーにはなりません)

7 / 2は割り切れないため小数になります。整数の商を期待するなら、割る数か演算方法を見直す必要があります。

直し方: 21 にします。

この問題を解いてみる →

パターン3

 1  <?php
 2  $minutes = 100;
 3  $hours = $minutes / 60       ;
                       ^
 4  echo $hours;
出力: 1.6666666666667期待: 1 (エラーにはなりません)

/演算子は小数を返すため、時間の商のような整数値が欲しい場面ではintdiv()を使う必要があります。

直し方: $minutes / 60intdiv($minutes, 60) にします。

この問題を解いてみる →

よくある誤解

「整数同士の割り算だから結果も整数になるはず」という、C・Javaなど静的型付け言語の感覚は通用しません。PHPの/は常に正確な商を返そうとするため、割り切れなければfloatになります。

まとめ

整数同士の割り算 / が小数になる(整数除算ではない)は初級でつまずきやすい項目です。上の3パターンを実際に手で直すと、エラーメッセージのどこを読めばよいかが掴めます。

演習をはじめる

関連するエラー

広告
広告スロット(未設定)