为什么这些字符串相等?

时间:2016-01-15 02:45:36

标签: php

我正在比较除第5个字符外相同的两个字符串。 PHP似乎认为它们在松散比较时是相同的,并且在严格比较时不一样(即使它们都是字符串,这意味着它们的类型匹配)。我是不会想到的,或者对此有合理的解释吗?

[21:39 ~]$ php -a
Interactive shell

php > var_dump('29273E-1443035285' == '29274E-1443035285');
bool(true)
php > var_dump('29273E-1443035285' === '29274E-1443035285');
bool(false)
php > %
[21:40 ~]$ php --version
PHP 7.0.2 (cli) (built: Jan  6 2016 11:50:59) ( NTS )
Copyright (c) 1997-2015 The PHP Group
Zend Engine v3.0.0, Copyright (c) 1998-2015 Zend Technologies

2 个答案:

答案 0 :(得分:2)

var_dump('29273E-1443035285' == '29274E-1443035285');

这些字符串看起来像浮点数,因此比较是在数字上下文中执行的,并且它们被转换为双精度数。因为它们非常小,所以它们都被解释为double(0)。这就是为什么他们彼此==

===将它们作为字符串进行测试,因为它们不是同一个字符串,所以测试返回false

答案 1 :(得分:0)

我认为PHP正在将第一组数字作为浮点进行评估,它们最大值或等于0(数学上不好,所以我不确定它们的相同之处。)。

第二个版本将它们作为字符串进行测试。

有关详细信息,请参阅此主题。 Why does ("00e0" == "00e1") evaluate as true?