2012-09-26 61 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

相关问题