2012-09-26 66 views
101

可能重複:
php == vs === operator
How do the equality (== double equals) and identity (=== triple equals) comparison operators differ?PHP表達兩種不同的字符串是相同

爲什麼下面的語句返回true的?

"608E-4234" == "272E-3063" 

我也試過用單引號圍繞字符串。我可以得到它evaulate到false的唯一方法是通過使用===操盤的==

我的猜測是PHP是把它當作某種公式,但它似乎有點陌生的一個。

有人可以詳細說明嗎?

+5

echo 608E-4234 = 0;回聲272E-3063 = 0; 0 == 0 – 2012-09-26 09:22:01

+3

http://php.net/strcmp說什麼? – Bokw

+14

[PHP弱/鬆散類型](http://stackoverflow.com/questions/467871/what-is-a-loosely-typed-language)。根據上下文,你聲稱的是一個字符串,事實上是其他的東西。所以如果你想比較字符串,最好使用'==='。瞭解你的運營商。 – hakre

回答

107

"608E-4234"float number format,所以他們會在比較時投入數字。

608E-4234272E-3063都將是float(0),因爲它們太小。

在PHP ==

如果你比較多個具有一個字符串或比較涉及 數字串,則每個串被轉換爲一個數字,並且 比較數值進行。

http://php.net/manual/en/language.operators.comparison.php

注意:

關於JavaScript的行爲也同時具有=====什麼?

答案是行爲不同於PHP。在JavaScript中,如果您比較兩個相同類型的值,則=====只是相同,因此與兩個相同類型值進行比較不會發生類型轉換。

在javascript中:

608E-4234 == 272E-3063 // true 
608E-4234 == "272E-3063" // true 
"608E-4234" == 272E-3063 // true 
"608E-4234" == "272E-3063" // false (Note: this is different form PHP) 

所以在JavaScript中,當你知道結果的類型,你可以使用==,而不是===保存一個字符。

例如,typeof操作總是返回一個字符串,所以你可以只使用

typeof foo == 'string'代替typeof foo === 'string'沒有危害。

+4

手冊中有關[運算符比較](http://php.net/manual/en/language.operators.comparison.php)的重要位:*如果將數字與字符串**進行比較或者比較涉及數字字符串**,然後將每個字符串轉換爲數字並進行數字比較。* –

+26

另請參閱:http://phpsadness.com/sad/47 – nickgrim

+5

'數字字符串 - > [什麼](http:// tvtropes .org/pmwiki/pmwiki.php/Main/FlatWhat)這難道不會在PHP中編寫安全的應用程序變得更加困難。 –

5

我在回答。 如果您使用的是「===」,那麼您還需要檢查類型而不是值。 如果您使用「==」,您只需檢查值是否相同。您可以參考herehere

10

PHP是比較這些字符串作爲浮點數,它們都爲零,所以你MUST使用===操作,

+2

正如我在我的答案中說,這是因爲兩個字符串比較爲浮點數,它們被舍入爲零,因此他們是**相等**,但不**相同** –

20

PHP使用IEEE 754輛彩車,和你的數字是如此之小,他們安勤0

參見:http://en.wikipedia.org/wiki/IEEE_floating_point

Name  Common name   Base Digits E min E max 
binary32 Single precision  2 23+1 −126 +127   
binary64 Double precision  2 52+1 −1022 +1023  
+2

但他沒有比較花車,他比較字符串。所以,PHP使用的浮動**應該是無關緊要的 – jalf

+2

@jalf php是鬆散的類型,並將背後的值轉換==如果你不熟悉語言是邪惡的,如果他想將它們作爲他需要的字符串進行比較像其他人提到的那樣使用===或strcmp。 – stoj

+7

@stoj是的,但我的觀點是,這個答案並沒有回答這個問題:它描述了PHP使用的fp表達,但沒有說明一個重要的事實,即「如果你的字符串看起來像一個FP值,它將被轉換成FP值「。 – jalf

13

我認爲PHP讀取此作爲一種科學的語法,將被翻譯爲:

608 x 10^-4234 == 272 x 10^-3063 

PHP將此解釋爲0 = 0

相關問題