1

なぜこのFALSE条件がTRUEなのですか?

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

3 に答える 3

3

からの引用:

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

$ a ==型ジャグリング後、$aが$bと等しい場合、$bはTRUEです。

数値を文字列と比較する場合、または比較に数値文字列が含まれる場合、各文字列は数値に変換され、比較は数値的に実行されます

つまり、文字列は両方とも数値であるため、最初に数値に変換されます。次に、一部のアーキテクチャでは、数値が非常に大きいため、最大整数サイズがオーバーフローし、同じ結果が得られます。

于 2013-02-24T17:49:23.963 に答える
2

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");
    }
于 2013-02-24T17:50:19.657 に答える
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!
于 2013-02-24T17:50:22.357 に答える