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


Benutzer-Avatar
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.

  • 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.

    – Carlos Campderros

    26. September 2012 um 9:28 Uhr

  • Siehe auch: phpsadness.com/sad/47

    – nickgrim

    26. September 2012 um 11:38 Uhr

  • 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


Benutzer-Avatar
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       

  • 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

Benutzer-Avatar
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.

Benutzer-Avatar
Matteo Tassinari

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

Benutzer-Avatar
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.

Benutzer-Avatar
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

1012020cookie-checkWarum wandelt PHP einen String mit dem Buchstaben E in eine Zahl um?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy