Warum wandelt PHP einen String mit dem Buchstaben E in eine Zahl um?
Lesezeit: 4 Minuten
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?
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
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.
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
Wichtige Bit aus dem Handbuch über Betreibervergleiche: Wenn Sie eine Zahl mit einer Zeichenfolge vergleichen oder der Vergleich beinhaltet numerische Zeichenfolgendann wird jeder String in eine Zahl umgewandelt und der Vergleich numerisch durchgeführt.
Numerical Strings -> Was. Macht es das nicht noch schwieriger, sichere Anwendungen in PHP zu schreiben?
– Sebastian Mach
26. September 2012 um 13:09 Uhr
@phresnel Nicht wirklich. Benutzen ===, die in PHP 101 für “diese Werte genau vergleichen” gelehrt werden sollte. Es ist nur verwirrend für Leute, die aus Sprachen ohne unscharfen Vergleich kommen, wie C und Java.
– Iskata
26. September 2012 um 13:55 Uhr
@lzkata: Das ist sicher, aber ich hätte nicht erwartet, dass solche Dinge passieren können, wenn ich zwei String-Literale vergleiche. Mit anderen Worten: Ich hätte nicht erwartet, dass, wenn ich zwei Operanden des exakt gleichen Typs vergleiche, eine Notwendigkeit für die besteht === Operator. Natürlich erwähnt die Dokumentation es, aber das Dokument ist es auch verschwommen, ziemlich verschwommen.
– Sebastian Mach
26. September 2012 um 14:07 Uhr
JvdBerg
PHP verwendet IEEE 754 für Gleitkommazahlen, und Ihre Zahlen sind so klein, dass sie 0 ergeben.
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
Aber er vergleicht keine Floats, er vergleicht Saiten. Also, was PHP für Floats verwendet sollen irrelevant sein
– jalf
26. September 2012 um 13:45 Uhr
@jalf php ist lose typisiert und konvertiert die Werte hinter den Kulissen == ist böse, wenn Sie mit der Sprache nicht vertraut sind. Wenn er sie als Zeichenfolgen vergleichen wollte, musste er === oder strcmp verwenden, wie andere erwähnt haben.
– stoj
26. September 2012 um 15:51 Uhr
@stoj ja, aber mein Punkt ist, dass diese Antwort die Frage nicht beantwortet: Sie beschreibt die von PHP verwendete fp-Darstellung, gibt jedoch nicht die wichtige Tatsache an, dass “wenn Ihre Zeichenfolge wie ein FP-Wert aussieht, wird sie konvertiert in ein FP-Wert”.
– jalf
26. September 2012 um 15:54 Uhr
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.
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