为什么这个FALSE条件为TRUE?
<?php
if(111111111111111119 == 111111111111111118)
{
echo 'Condition is TRUE!';
}
?>
答案 0 :(得分:3)
引自:
http://php.net/manual/en/language.operators.comparison.php
如果在类型杂耍之后$ a等于$ b,则$ a == $ b为TRUE
如果您将数字与字符串进行比较或比较涉及 数字字符串,然后每个字符串转换为一个数字和 比较数字化进行
因为你的字符串都是数字的,所以它们首先被转换为数字。 然后在一些架构上,数字是如此之大,以至于溢出最大整数大小并且你得到相同的结果。
答案 1 :(得分:2)
PHP DOC
将整数或浮点数转换为以文本方式表示数字的字符串(包括浮点数的指数部分)。浮点数可以使用指数表示法转换(4.1E + 6)。
如果浮点数超出整数的边界(通常在32位平台上+/- 2.15e + 9 = 2 ^ 31,在64位平台上+/- 9.22e + 18 = 2 ^ 63),结果是未定义的,因为float没有足够的精度来给出精确的整数结果。发生这种情况时,不会发出警告,甚至不会发出通知!
我猜你使用的是32位系统,因此
var_dump(111111111111111119,111111111111111118);
var_dump(111111111111111119 === 111111111111111118); // would be true on 32bit
输出
float 1.1111111111111E+17
float 1.1111111111111E+17
true
简单解决方案
if(bcsub("111111111111111119", "111111111111111118") == "0")
{
// 32 bit true
var_dump("Am Free");
}
答案 2 :(得分:0)
因为它被转换为数值
if('111111111111111119' == '111111111111111118')
{
echo 'Condition is TRUE!';
} else {
echo 'Condition is FALSE!';
}
// on 64 bit: condition is FALSE! (tested on my mac)
我认为在32位机器上它是真的。即使我删除了我的mac上的引号,它也显示为false。
if('a111111111111111119' == 'a111111111111111118')
{
echo 'Condition is TRUE!';
} else {
echo 'Condition is FALSE!';
}
// condition is FALSE!