PHP で float から int への変換を理解しようとしていますが、次のコードに出くわしました:
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
私の質問は、なぜ 8 ではなく 7 をエコーするのですか? その背後にあるロジックは何ですか?
PHP で float から int への変換を理解しようとしていますが、次のコードに出くわしました:
echo (int) ( (0.1+0.7) * 10 ); // echoes 7!
私の質問は、なぜ 8 ではなく 7 をエコーするのですか? その背後にあるロジックは何ですか?
ここ:
$var = (int) $othervar;
私は推測します:
$var = int($othervar);
もうまくいくでしょう。しかし、そうではありません!
gettype()
get_class()
どちらも文字列を返し、引数または null が指定されていないget_class()
場合は現在のクラスを返します。非オブジェクトを指定した場合は、get_class()
何らかのエラーです。
これらの関数は、PHP がいかに悪いかを示す例です。楽しい事実です。なぜなら、(function、expects 、gettype()
および「typename」) と(operator)get_class()
もある「アンダースコアがあるものを推測する」必要があるからです。is_a()
$var
instanceof
代わりに、次のとおりです。
$var = intval($othervar);
そしてfloatval
、それらの後に val がたくさんあります。より多くの PHP の愚かさ。
ご了承ください:
$var = (string) $othervar;
メソッドを呼び出します$othervar's __toString()
が、メソッドはなく、__toInt()
文字列だけです。
お役に立てれば。
補遺:
整数は常に切り捨てられるため、7 になります。
その他の補遺:
より制御された変換が必要な場合は、期待どおりに機能する round() を使用できますfloor()
(切り捨て、したがって、7 少ない x 8 階未満を 7 に、-3 少ない x 2 階未満を -3 に)、ceil()
切り上げます ( 7 少ない x 8 ceils 少ない 8、-3 少ない x -2 ceils 少ない -2)
この質問は、次のほぼ正確なコピーです。
なぜ PHP は (int) ((0.1+0.7)*10) の結果を 8 ではなく 7 に変換するのでしょうか?
たとえでも!
メモリに格納されている実際の値は、丸め誤差が原因である 7.999999999999999999999999 のようなものです。
あなたも使うことができますintval()
$float = 7.99999999999999999999999999999999;
$int = intval($float);
echo $int;