为什么这个FALSE条件为TRUE?

时间:2013-02-24 17:41:25

标签: php

为什么这个FALSE条件为TRUE?

<?php
if(111111111111111119 == 111111111111111118)
{
    echo 'Condition is TRUE!';
} 
?>

3 个答案:

答案 0 :(得分:3)

引自:

http://php.net/manual/en/language.operators.comparison.php

  如果在类型杂耍之后$ a等于$ b,则

$ a == $ b为TRUE

     

如果您将数字与字符串进行比较或比较涉及   数字字符串,然后每个字符串转换为一个数字和   比较数字化进行

因为你的字符串都是数字的,所以它们首先被转换为数字。 然后在一些架构上,数字是如此之大,以至于溢出最大整数大小并且你得到相同的结果。

答案 1 :(得分:2)

PHP DOC

Converting to string

  

将整数或浮点数转换为以文本方式表示数字的字符串(包括浮点数的指数部分)。浮点数可以使用指数表示法转换(4.1E + 6)。

Converting to integer

  

如果浮点数超出整数的边界(通常在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!