私のコードでは奇妙なことが起こっています。誰かがなぜこの状態が間違っているのか説明できますか?この条件はなぜ偽ですか?
PHPの機能var_dump()
とI出力オブジェクトのメンバーは、私はこれを取得:一つのオブジェクトから
string(6) "105.63"
float(105.63)
を、これは別のオブジェクトから出力された:
string(6) "667.69"
float(667.69)
それから私はこのような比較を行います:
if(105.63 == "105.63"){
echo "true";
} else {
echo "false";
}
if(667.69 == "667.69"){
echo "true";
} else {
echo "false";
}
2回出力true
f上記の私の例のようなコードを書いているかどうかは確かです。しかし、私のクラスでは、それは異なって振る舞います。最初にif
で私はfalse
を得て、次にif
でtrue
を得る。それから私はvar_export()
機能をより深くデータを見て、私は実際にデータを以下しているように思える:
'105.63'
105.6300000000000096633812063373625278472900390625
と
'667.69'
667.69000000000005456968210637569427490234375
をだから私は私の条件は、そのデータを扱う天気をチェックすることを決定しました。..彼らはいない。実際は、最初のものだけがそうではありません。次のコードで出力がfalse
とtrue
になるのはなぜですか?
if(105.6300000000000096633812063373625278472900390625 == "105.63"){
echo "true";
} else {
echo "false";
}
if(667.69000000000005456968210637569427490234375 == "667.69"){
echo "true";
} else {
echo "false";
}
これを解決する方法はわかりました。しかし、なぜ最初に条件が満たされないのか興味がありますif
。 PHPは、我々は==
比較演算子を使用するときにジャグリングを入力し
EDIT
! これを見てください:
var_export((float) "105.63");
var_export((string) 105.6300000000000096633812063373625278472900390625);
var_export((float) "667.69");
var_export((string) 667.69000000000005456968210637569427490234375);
出力:
105.63
'105.63'
667.69000000000005
'667.69'
はこれが最初の条件が真であることを意味し、二偽のではないでしょうか?しかし、私は最初に偽になり、2番目に真実になります。私が不明な場合は申し訳ありません。
[浮動小数点表現(https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) –
有限の紙を使用するシステムでは、バイナリに同じ問題があります。浮動小数点に対して '=='を使用しないで、代わりに '$ epsilon'が任意の小さな定数(精度)である' abs($ number- $ otherNumber)<$ epsilon'を使用してください。 – apokryfos
私の編集をチェックしてください。 – ksno