104

重複の可能性:
php == vs === operator
等価 (== double equals) と ID (=== triple equals) 比較演算子はどのように異なりますか?

次のステートメントが を返すのはなぜtrueですか?

"608E-4234" == "272E-3063"

文字列を一重引用符で囲んでこれも試しました。評価する唯一の方法は、代わりに演算子falseを使用することです=====

私の推測では、PHP はこれをある種の方程式として扱っていますが、少し奇妙に思えます。

誰でも詳しく説明できますか?

4

6 に答える 6

109

"608E-4234"浮動小数点数形式であるため、比較すると数値にキャストされます。

608E-4234272E-3063どちらも小さfloat(0)すぎるためです。

==phpでは、

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

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

注意:

==と の両方を持つ JavaScript の動作はどう===ですか?

答えは、動作が PHP とは異なるということです。JavaScript では、同じ型の 2 つの値を比較する場合、==は と同じ===であるため、2 つの同じ型の値の比較では型キャストは発生しません。

JavaScript の場合:

608E-4234 == 272E-3063 // true
608E-4234 == "272E-3063" // true
"608E-4234" == 272E-3063 // true
"608E-4234" == "272E-3063" // false (Note: this is different form PHP)

したがって、JavaScript では、結果の型がわかっている場合は、1 文字を保存する==代わりに使用できます。===

たとえば、typeof演算子は常に文字列を返すため、次のように使用できます

typeof foo == 'string'代わりにtypeof foo === 'string'害はありません。

于 2012-09-26T09:22:38.803 に答える
20

PHP は float に IEEE 754 を使用しますが、数値が小さすぎて 0 に評価されます。

参照: http://en.wikipedia.org/wiki/IEEE_floating_point

Name        Common name         Base    Digits  E min   E max   
binary32    Single precision        2   23+1    −126    +127        
binary64    Double precision        2   52+1    −1022   +1023       
于 2012-09-26T09:24:28.027 に答える
13

PHP はこれを科学的な構文として読み取り、次のように翻訳されると思います。

608 x 10^-4234 == 272 x 10^-3063 

PHP はこれを と解釈し0 = 0ます。

于 2012-09-26T09:24:49.217 に答える
10

PHP はこれらの文字列を浮動小数点数として比較し、どちらもゼロであるため、演算子を使用する必要があります。===

于 2012-09-26T09:23:29.873 に答える
5

私は答えようとしています。「===」を使用している場合は、値の代わりにタイプもチェックします。「==」を使用している場合は、値が同じかどうかを確認するだけです。

herehereを参照できます。

于 2012-09-26T09:23:03.923 に答える
3

これはそれが見ているものです:
http://www.wolframalpha.com/input/?i=608E-4234&dataset=
http://www.wolframalpha.com/input/?i=272E-3063

これらは変数に収まらないため、どちらも 0 または php が選択するデフォルト値に等しいため、同等です。

于 2012-09-26T09:25:47.337 に答える