2016-11-03 18 views
1

我的代碼中發生了一些奇怪的事情。請問有人可以解釋爲什麼這種情況是錯誤的?爲什麼這個條件是錯誤的?

當我輸出對象與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 

所以我決定請檢查是否我的條件與數據工作..他們沒有。其實,只有第一個沒有。爲什麼我在下面的代碼中得到輸出falsetrue

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' 

如果不是這意味着,第一個條件是真實的和虛假的第二?但是我首先得到了假,而真正得到了第二。對不起,如果我不清楚。

+2

[浮點表示](https://en.wikipedia.org/wiki/Floating_point#Accuracy_problems) –

+0

對於不能代表的比率相同的原因1/3十進制系統使用有限的紙張,二進制文件也有同樣的問題。不要使用'=='作爲浮點數,而是使用'abs($ number- $ otherNumber)<$ epsilon',其中'$ epsilon'是一個任意小的常量(精度)。 – apokryfos

+0

請檢查我的編輯。 – ksno

回答

3

檢查手冊:http://php.net/manual/en/language.types.float.php

有關於比較浮點數大的警告部分:

警告

浮點精度

浮點數有限精確。雖然它取決於系統,但PHP通常使用IEEE 754雙精度格式,即 ,由於以1.11e-16的順序 進行四捨五入,因此它會給出最大相對誤差。非基本算術運算可能會給出更大的錯誤,當然,當幾個操作複合時,必須考慮錯誤傳播。此外, 可精確表示爲基數10中的浮點數(如 0.1或0.7)的有理數並不具有與基數2中的浮點數一樣的內部使用的精確表示,而不管尾數爲 的大小。因此,它們不能被轉換成它們的內部二進制對象,而不會有小的精度損失。這可能導致 令人困惑的結果:例如,floor((0.1 + 0.7)* 10)通常將 返回7而不是預期的8,因爲 的內部表示將類似於7.9999999999999991118 ....所以永遠不要相信 浮點數結果爲最後一位數字,並且不會直接比較浮點數以便相等。如果需要更高的精度, 任意精度數學函數和gmp函數是 可用。有關「簡單」的解釋,請參閱»浮點數指南 ,也標題爲「爲什麼我的數字不加起來?」

Why dont my numbers add up?

+0

請檢查我的編輯。 – ksno