比较失败,大数PHP

时间:2018-05-25 10:27:47

标签: php

我正在阅读一篇文章,我找到了这个例子:

// Prints bool(true)
var_dump('9223372036854775807' == '9223372036854775808');

// Prints bool(false)
var_dump('9223372036854775807' ==='9223372036854775808');

任何人都可以解释我为什么?

4 个答案:

答案 0 :(得分:2)

来自redditphp bug report

这里发生了一些事情。

如果值的类型不同,则

==不会返回false。在这种情况下,PHP将字符串转换为浮点数以比较数字,并且由于它们的大小和PHP处理浮点数的方式,它们被舍入到相同的数字,因此将2个字符串作为数字进行比较它们是相同的。

===强制类型必须相同。所以将这两者比作字符串就不一样了。

正如@Classified在另一条评论中提到的,这在PHP 5.4.4中得到修复,因此不是当前的错误。

答案 1 :(得分:1)

两种情况都应该返回 FALSE ,因为数字不同,但我认为你的疑问是关于' == '和' === ' AND 为什么第一个案例返回true 对吧?

当您使用' == '时,您正在比较值是否等于 BEFORE type-juggling ,当您使用' === '您在比较值是否等于 AFTER type-juggling 。 换句话说,当使用' == '时,您要比较值是否等于,但是当您使用' === 时'你在比较值和类型是否等于

在这些情况下,两个比较都应该返回 FALSE 因为值不同,但是关于返回 TRUE 的第一个比较,这是PHP中的错误,因为你可以见:https://bugs.php.net/bug.php?id=54547

PS: 9223372036854775807 是一个更大的int数字,所以如果你用 gettype()检查类型,你会看到:

9223372036854775807 整数
9223372036854775808

答案 2 :(得分:-2)

  

从PHP 5.4.4开始,这不再是一个问题。

之所以发生这种情况,是因为类型杂耍。在第一个例子中,你要检查两个值是否相等 AFTER 类型 - 玩杂耍,这样才能有效地比较两种字符串类型。

在另一个示例中,您要检查两个值是否相同,如同相同类型和完全相同的值。

检查this.

答案 3 :(得分:-2)

<?php
var_dump('9223372036854775807' == '9223372036854775808');
var_dump('9223372036854775807' ==='9223372036854775808');

输出:

bool(false) 
bool(false)

没有。请参阅上面运行的确切代码,以获取证明https://3v4l.org/4oHvo

  

更新:

根据以下评论,看起来这个人要求使用的是4年前不再受支持的PHP版本,并且可能容易受到安全漏洞的影响。更新你的PHP!

请参阅php.net https://secure.php.net/eol.php

上的生命周期结束图表