3

我只是在调试一个脚本,发现 if 语句没有按我预期的方式工作。

var_dump("6064365413078728979" == "6064365413078728452");
die();

上面的代码将产生以下结果:

bool(true)

使用 === 运算符,它可以按预期工作。任何人有任何想法为什么?

我在 x64 Windows 机器上使用 PHP 版本 5.3.13 和 wamp 安装。

4

2 回答 2

7

PHP具有松散的类型比较行为,因此您的数字字符串在==非严格比较之前被转换为整数类型,并且转换结果溢出。

这是在可能的情况下使用的主要原因===

查看此页面以获取有关类型杂耍的更多详细信息。

于 2013-01-10T13:39:15.020 回答
3
<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>

当你运行它时,在你的机器上可能会超过一个数字的限制,这是一个数字比较发生。试试上面的脚本,看看 $a 的值可能与你给出的值不同。

这就是为什么当两者在数字上进行比较时,它们是相等的。因此 ,按照其他人的建议使用===

编辑:基于@Axel 建议的解释。

PHP手册解释

浮点数的大小取决于平台,尽管最大约 1.8e308 和大约 14 位十进制数字的精度是一个常见值(64 位 IEEE 格式)。

这个网站提供和解释溢出现象和一个小的 php 代码来测试你的系统的整数和浮点范围。了解服务器上的限制很可能最好地解释为什么会出现报价流

于 2013-01-10T13:46:24.637 回答