3

スクリプトをデバッグしていたところ、if ステートメントが期待どおりに機能していないことがわかりました。

var_dump("6064365413078728979" == "6064365413078728452");
die();

上記のコードは、次のようになります。

bool(true)

=== 演算子を使用すると、期待どおりに機能します。誰でも理由がわかりますか?

x64 WindowsマシンにワンプをインストールしてPHPバージョン5.3.13を使用しています。

4

2 に答える 2

7

==PHPの型比較動作は緩いため、厳密でない比較の前に数値文字列が整数型に変換され、変換結果がオーバーフローします。

それが可能な場合に使用する主な理由===です。

型ジャグリングの詳細については、このページを参照してください

于 2013-01-10T13:39:15.020 に答える
3
<?php
$a=6064365413078728979;
$b=6064365413078728452;
echo $a."<br>".$b;
//var_dump( $a==$b );
die();
?>

それを実行すると、マシンで数値の制限を超えている可能性があり、数値比較が行われます。上記のスクリプトを試してみて、$a の値がおそらく指定した値と異なることを確認してください。

そのため、両者を数値的に比較すると、両者は等しいのです。したがって 、他の人が提案したように===を使用してください

編集:@Axelのアドバイスに基づく説明。

PHPマニュアルの説明

float のサイズはプラットフォームに依存しますが、一般的な値は約 14 桁の精度で最大 ~1.8e308 です (64 ビット IEEE 形式)。

また、この Web サイトでは、オーバーフロー現象と、システムの整数と浮動小数点の範囲をテストするための小さな PHP コードを提供および説明しています。サーバーの制限を知ることは、おそらくオファーフローが発生した理由を最もよく説明するでしょう

于 2013-01-10T13:46:24.637 に答える