我的代碼中發生了一些奇怪的事情。請問有人可以解釋爲什麼這種情況是錯誤的?爲什麼這個條件是錯誤的?
當我輸出對象與PHP的功能var_dump()
會員,我得到這個:
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並當我們使用==
比較運算類型戲法! 看看這個:
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'
如果不是這意味着,第一個條件是真實的和虛假的第二?但是我首先得到了假,而真正得到了第二。對不起,如果我不清楚。
[浮點表示](https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) –
對於不能代表的比率相同的原因1/3十進制系統使用有限的紙張,二進制文件也有同樣的問題。不要使用'=='作爲浮點數,而是使用'abs($ number- $ otherNumber)<$ epsilon',其中'$ epsilon'是一個任意小的常量(精度)。 – apokryfos
請檢查我的編輯。 – ksno