1

PHP で float から int への変換を理解しようとしていますが、次のコードに出くわしました:

echo (int) ( (0.1+0.7) * 10 ); // echoes 7!

私の質問は、なぜ 8 ではなく 7 をエコーするのですか? その背後にあるロジックは何ですか?

4

3 に答える 3

1

ここ:

$var = (int) $othervar;

私は推測します:

$var = int($othervar);

もうまくいくでしょう。しかし、そうではありません!

gettype()get_class()どちらも文字列を返し、引数または null が指定されていないget_class()場合は現在のクラスを返します。非オブジェクトを指定した場合は、get_class()何らかのエラーです。

これらの関数は、PHP がいかに悪いかを示す例です。楽しい事実です。なぜなら、(function、expects 、gettype()および「typename」) と(operator)get_class()もある「アンダースコアがあるものを推測する」必要があるからです。is_a()$varinstanceof

代わりに、次のとおりです。

$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 に変換するのでしょうか?

たとえでも!

于 2013-08-24T01:46:05.593 に答える
0

メモリに格納されている実際の値は、丸め誤差が原因である 7.999999999999999999999999 のようなものです。

于 2013-08-24T01:43:58.360 に答える
0

あなたも使うことができますintval()

$float = 7.99999999999999999999999999999999;
$int = intval($float);

echo $int;
于 2013-08-24T02:00:26.020 に答える