PHP表示两个不同的字符串相同

PHP表示两个不同的字符串相同,php,string,Php,String,可能重复: 为什么下面的语句返回true "608E-4234" == "272E-3063" 我也尝试过用单引号括住字符串。要使其计算为false的唯一方法是使用==操作符,而不是= 我的猜测是PHP将其视为某种等式,但它似乎有点奇怪 有人能详细说明一下吗?“608E-4234”是最重要的,所以它们在比较时会被转换成数字 608E-4234和272E-3063都将是float(0),因为它们太小了 对于php中的== 如果将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串

可能重复:

为什么下面的语句返回
true

"608E-4234" == "272E-3063"
我也尝试过用单引号括住字符串。要使其计算为
false
的唯一方法是使用
==
操作符,而不是
=

我的猜测是PHP将其视为某种等式,但它似乎有点奇怪

有人能详细说明一下吗?

“608E-4234”
是最重要的,所以它们在比较时会被转换成数字

608E-4234
272E-3063
都将是
float(0)
,因为它们太小了

对于php中的
==

如果将数字与字符串进行比较,或者比较涉及 数字字符串,然后将每个字符串转换为一个数字和 进行数值比较

注意:

javascript中同时具有
=
==
的行为如何?

答案是行为与PHP不同。在javascript中,如果比较两个具有相同类型的值,
==
==
相同,因此比较两个相同类型的值时不会发生类型转换

在javascript中:

因此,在javascript中,当您知道结果的类型时,可以使用
=
而不是
==
来保存一个字符

例如,
typeof
操作符总是返回一个字符串,所以您可以使用

typeof foo==='string'
而不是
typeof foo==='string'
,没有任何伤害。

我正在尝试回答。 如果您使用的是“=”,那么还可以使用类型而不是值进行检查。 如果使用“==”,只需检查值是否相同即可


您可以引用和。

PHP将这些字符串作为浮点数进行比较,它们都是零,因此您必须使用
==
运算符,

PHP使用IEEE 754进行浮点运算,并且您的数字非常小,因此它们会求值为0

见:


我认为PHP将此理解为一种科学的语法,可以翻译为:

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

PHP将其解释为
0=0

这就是它所看到的:


因为它们不适合变量,所以它们都等于0,或者php选择的任何默认值,因此它们是等效的。

echo 608E-4234=0;回波272E-3063=0;0==0表示什么?。根据上下文的不同,您声称的是字符串,实际上是其他东西。因此,如果要比较字符串,最好使用
==
。了解你的运算符。@Bokw:实际上,这个问题并不是完全重复的,它不仅仅是关于
弱/松散类型的问题,而是PHP的
==
的行为将把数字字符串与
=
相比转换成数字,即使它们都是字符串。这种行为不同于javascript,后者也有
==
==
。正如我在回答中所说的,这是因为这两个字符串作为浮点数进行比较,四舍五入为零,因此,它们相等但不相同。手册中的重要一点是:如果将数字与字符串进行比较,或者比较涉及数字字符串,然后将每个字符串转换为一个数字,并以数字进行比较。另请参见:
数字字符串
->这不会使用PHP编写安全应用程序更加困难。@phresnel不太可能。使用
==
,这应该在PHP101中教授“精确比较这些值”。对于那些来自没有模糊比较的语言(如C和Java)的人来说,这只会让他们感到困惑。@lzkata:这是肯定的,但我没想到当我比较两个字符串文本时,会发生这样的事情。换句话说:当我比较两个完全相同类型的操作数时,我没有想到需要使用
=
操作符。当然文档中提到了,但是文档也提到了。但是他不是在比较浮动,而是在比较字符串。因此,PHP用于浮点数的内容应该是irrelevant@jalfphp是松散类型的,并且在幕后转换值==是邪恶的,如果您不熟悉该语言,如果他想将它们作为字符串进行比较,他需要使用===或其他人提到的strcmp。@stoj是,但我的观点是,这个答案并没有回答这个问题:它描述了PHP使用的fp表示,但没有说明“如果字符串看起来像fp值,它将被转换为fp值”这一重要事实。
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       
608 x 10^-4234 == 272 x 10^-3063