なぜこの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 ==型ジャグリング後、$aが$bと等しい場合、$bはTRUEです。
数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、比較は数値的に実行されます
つまり、文字列は両方とも数値であるため、最初に数値に変換されます。次に、一部のアーキテクチャでは、数値が非常に大きいため、最大整数サイズがオーバーフローし、同じ結果が得られます。
PHP DOC
整数またはfloatは、数値をテキストで表す文字列に変換されます(floatの指数部分を含む)。浮動小数点数は、指数表記(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");
}
数値に変換されるので
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!