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