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