我只是在调试一个脚本,发现if语句没有按我期望的方式工作。
var_dump("6064365413078728979" == "6064365413078728452");
die();
上面的代码将产生如下结果:
bool(true)
使用===操作符,它按预期工作。有人知道为什么吗?
我正在使用PHP版本5.3.13与wamp安装在x64 windows机器上。
PHP具有松散的类型比较行为,因此您的数字字符串在==
非严格比较之前被转换为整数类型,并且转换结果溢出。
这就是在可能的情况下使用===
的主要原因。
请查看本页以了解更多关于类型杂耍的详细信息
<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>
当你运行它时,那么在你的机器上,可能超过了一个数字的限制,这是一个正在发生的数字比较。试试上面的脚本,你会发现$a的值可能与你给出的值不同。
这就是为什么当两者在数值上比较时,它们是相等的。因此按照别人的建议使用===
编辑:基于@Axel's Advice的解释
PHP手册解释
浮点数的大小与平台有关,但最大值为~1.8e308,精度约为14位十进制数字是常见的值(64位IEEE格式)。
这个网站提供了关于溢出现象的解释和一个小的php代码来测试你的系统的整数和浮点范围。了解服务器上的限制最有可能解释为什么会出现offerflow