Implicit conversion from float to int loses precision という警告について
PHP 8.1 以上へのバージョンアップ時に指摘される警告です。
float から int への暗黙の変換は推奨されなくなりました。
暗黙の float から int への変換
この記事では Implicit conversion from float to int loses precision の発生原因と解消方法について説明します。
Implicit conversion from float to int loses precision
シンプルな関数を作成してみるとよくわかります。
int 型で受けとった変数を返す関数を定義しました。値を渡したときの動きを見てみます。
function getIntNum(int $num) {
return $num;
}
発生原因の確認
引数に int 型ではない変数が渡された時に暗黙の型変換が行われます。
int 型の変数を渡した場合
getIntNum(1);
gettype: int
return: 1
エラー(警告): なし
double(float) 型の変数を渡した場合
getIntNum(1.5);
gettype: double
return: 1
エラー(警告): Deprecated: Implicit conversion from float 1.5 to int loses precision
string 型の変数を渡した場合
getIntNum('1');
gettype: string
return: 1
エラー(警告): なし
getIntNum('1.5');
gettype: string
return: 1
エラー(警告): Deprecated: Implicit conversion from float-string "1.5" to int loses precision
解決方法
警告が発生したのは double(float) 型の変数を渡した場合と、 string 型の変数 ('1.5') を渡した場合の 2 パターンでした。解決方法はとても簡単です。
double(float) 型の変数を渡した場合
getIntNum((int) 1.5);
gettype: double
return: 1
エラー(警告): なし
string 型の変数を渡した場合
getIntNum((int) '1.5');
gettype: string
return: 1
エラー(警告): なし
引数を渡す際に int 型にキャストすれば警告が出なくなります。
まとめ
PHP などの動的型付け言語では変数の型を明示的に宣言しなくても動作するメリットがある一方で、思わぬところで意図した結果が得られないという問題が発生する可能性があります。これからは意図せず精度を損なうことがないように、型を意識して変数を定義する必要がありそうです。
ご質問等ありましたら,お手数ですが弊社の個人情報保護方針をお読み頂いた上でフォームからお願い致します.
※このページと無関係な内容のセールスはご遠慮ください.