Warum kehrt die folgende Anweisung zurück true
?
"608E-4234" == "272E-3063"
Ich habe dies auch mit einfachen Anführungszeichen um die Zeichenfolgen versucht. Nur so kann ich es auswerten false
ist durch die Verwendung der ===
Betreiber statt ==
Meine Vermutung ist, dass PHP es als eine Art Gleichung behandelt, aber es scheint ein bisschen seltsam zu sein.
Kann jemand näher darauf eingehen?

xdazz
"608E-4234"
ist der Float-Zahlenformatalso werden sie beim Vergleichen in Zahlen gegossen.
608E-4234
und 272E-3063
werden beide sein float(0)
weil sie zu klein sind.
Für ==
in php,
Wenn Sie eine Zahl mit einer Zeichenfolge vergleichen oder den Vergleich einbeziehen
numerische Zeichenfolgendann wird jeder String in eine Zahl umgewandelt und der Vergleich numerisch durchgeführt.
http://php.net/manual/en/language.operators.comparison.php
Beachtung:
Was ist mit dem Verhalten in Javascript, das auch beides hat ==
und ===
?
Die Antwort ist, dass sich das Verhalten von PHP unterscheidet. Wenn Sie in Javascript zwei Werte mit demselben Typ vergleichen, ==
ist genauso wie ===
sodass keine Typumwandlung für den Vergleich mit zwei gleichen Typwerten erfolgt.
Im 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)
Also in Javascript, wenn Sie den Typ des Ergebnisses kennen, könnten Sie verwenden ==
anstatt ===
um ein Zeichen zu speichern.
Zum Beispiel, typeof
Operator gibt immer eine Zeichenfolge zurück, also könnten Sie einfach verwenden
typeof foo == 'string'
anstatt typeof foo === 'string'
ohne Schaden.

JvdBerg
PHP verwendet IEEE 754 für Gleitkommazahlen, und Ihre Zahlen sind so klein, dass sie 0 ergeben.
Sehen: 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

Mihai Matei
Ich denke, dass PHP dies als wissenschaftliche Syntax liest, die übersetzt wird als:
608 x 10^-4234 == 272 x 10^-3063
PHP interpretiert dies als Sein 0 = 0
.

Matteo Tassinari
PHP vergleicht diese Strings als Fließkommazahlen, und beide sind Null, also Sie MUSS benutze die ===
Operator,

Alfred Angkasa
Ich versuche zu antworten. Wenn Sie “===” verwenden, prüfen Sie auch mit dem Typ anstelle des Werts. Wenn Sie “==” verwenden, prüfen Sie einfach, ob der Wert gleich ist oder nicht.
auf die du verweisen kannst hier und hier.

Joebone
Das ist, was es sieht:
http://www.wolframalpha.com/input/?i=608E-4234&dataset=
http://www.wolframalpha.com/input/?i=272E-3063
Da sie nicht in die Variable passen, entsprechen sie beide 0 oder dem von PHP gewählten Standardwert und sind daher gleichwertig.
Andere Antworten haben dies bemerkt, aber das PHP-Handbuch hat dies jetzt explizit gemacht. PHP sieht jeden String mit einem E
begrenzt durch Zahlen als wissenschaftliche Notation
EXPONENT_DNUM (({LNUM} | {DNUM}) [eE][+-]? {LNUM})
Wie Sie sehen können, wird die Groß-/Kleinschreibung nicht beachtet (E
oder e
). Wo dies zu einem Fallstrick wird, sind String-Vergleiche schwacher Typen
var_dump("2E1" == "020"); // true
2E1
ist wirklich 2 * (10 ^ 1)
und das ergibt 20. Fügen Sie dort einen beliebigen anderen Buchstaben ein und es wird das Erwartete zurückgegeben false
. Aus der Frage
"608E-4234" == "272E-3063"
Das klappt
608 * (10 ^ -4234) == 272 * (10 ^ -3063)
Keine der Zahlen kann von PHP dargestellt werden (wie JvdBerg feststellte), daher werden sie in konvertiert 0
10120200cookie-checkWarum wandelt PHP einen String mit dem Buchstaben E in eine Zahl um?yes
Echo 608E-4234 = 0; Echo 272E-3063 = 0; 0==0
– Benutzer557846
26. September 2012 um 9:22 Uhr
PHP ist schwach/locker typisiert. Je nach Kontext ist das, was Sie als Zeichenfolge bezeichnen, tatsächlich etwas anderes. Also besser nutzen
===
wenn Sie Zeichenfolgen vergleichen möchten. Kennen Sie Ihre Operatoren.– hakre
26. September 2012 um 9:25 Uhr