Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder einen alternativen Browser verwenden.
Wahrscheinlich ist das Ergebnis von $php * 100 nicht 124936 sondern 124935,99999999999999999999999999.
Nur das der aufgerundete Wert angezeigt wird.
Floats sind halt nicht sehr genau.
Ok, das sehe ich auch irgendwie ein, aber ich würde dann doch erwarten, dass mir var_dump zumindest die korrekte Zahl ausgibt, die auch intern verwendet wird. Gibt es für solche Zwecke bessere Funktionen als var_dump?
Oder anders ausgedrückt: Wie vergleiche ich, ob eine Zahl aus einer MySQL decimal Zahl einem erwarteten berechneten Wert entspricht? Meine derzeitige Lösung sieht so aus:
Deine Ausgabe von Java ist das was ich von var_dump aus PHP erwarten würde...
Dass float Operationen kritisch sind, ist ärgerlich, aber leider nicht zu verhindern. Aber ich würde dann doch zumindest beim debuggen erwarten, dass PHP mir das darstellen kann. Selbst debug_zval_dump versagt kläglich. Gibt es da irgendwelche debug Möglichkeiten?
Ich bin jetzt nicht der große PHP-Experte, aber das könnte an der dynamischen Typisierung von PHP liegen. Evtl. macht PHP hier irgendwelche casts die zu diesem Ergebnis führen.
Oder anders ausgedrückt: Wie vergleiche ich, ob eine Zahl aus einer MySQL decimal Zahl einem erwarteten berechneten Wert entspricht? Meine derzeitige Lösung sieht so aus:
Regel Nummer 1 von Floats: Man vergleicht nicht mit Eindeutigkeit. Du prüfst ob zwei Flaots "identisch" sind, indem du schaust ob nur ein sehr kleiner Delta-Wert (Theta) Unterschied zwischen beiden ist:
Code:
abs($float - $float2) <= 0.0000000001
Begründung: Floats sind nicht assoziativ, d.h. a + b + c kann ein anderes Ergebnis haben als b + a + c. Du kannst dir nie sicher sein, dass wirklich haargenau ein erwarteter Wert rauskommt. Wenn das wirklich nötig ist rechne nur mit Integern oder arbeite mit Erweiterungen die genaues Rechnen mit Nachkommastellen ermöglichen wie bcmath.
Super Antwort von ice-breaker!
Ich habs jetzt allerdings mit round() gelöst. Erfüllt den gleichen Zweck.
Falls aber doch jemand eine hilfreiche debug Funktion kennt, dann wäre ich dem sehr verbunden. Man hat in der Praxis nun mal häufig mit Code zu tun, wo mit floats jongliert wird. Wenn dann mal was schief läuft ist man dann am rätseln ...
Wie wärs statt mit Debug Funktionen mit einem richtigen Debugger/IDE zu arbeiten? xDebug z.B. Ist bei mir einige Zeit her, aber der sollte doch sehr genaue Informationen über Variablenzustände ausgeben...
Du hast zwar völlig recht mit der potentiell unterschiedlichen Präzision des Ergebnisses, aber mit der Assoziativität des Plus-Operators hinsichtlich Floats an sich hat das nichts zu tun, natürlich sind die beiden Ausdrücke gleichwertig.
Ich habe allerdings Erinnerungen, dass man Fälle bei PHP gibt, wo man sich eben nicht darauf verlassen kann. Kann aber gerade keinen Fall konstruieren der das aufzeigt.
ice-breaker bezog sich oben doch klar auf die Addition von Floats, nicht auf beliebige Datentypen.
Und auch wenn ich mich mit PHP nicht auskenne, so denke ich kaum, dass "5" + 0.3 + 10 + true im Rahmen der Fließkomma-Präzision in einem anderen Ergebnis resultiert als true + 10 + "5" + 0.3. Kannst du da mal ein Beispiel anführen?
Aber mal zurück zum Thema:
xdebug gibt mir leider mit var_dump auch nicht mehr aus. Also ich erkenne nicht wie bei dem Beispiel mit Java, dass intern mit einer anderen Float gerechnet wird, als dargestellt.
Du könntest dir testweise mal die Binärrepräsentation der Zahl anschauen. Laut PHP-Doku könnte das vielleicht mit pack gehen. Wenn du weißt, wie eine IEEE 754 Zahl aufgebaut ist, dann kannst du die binäre Darstellung hernehmen und mit einem geeignet genauen Taschenrechner (evt. tut es da die Wolfram-Alpha Website) nachschauen, welche Zahl wirklich dahinter steckt. Voraussetzung ist, das dieser pack-Befehl auch tatsächlich die IEEE Repräsentation des Floats ausspuckt.
Die Java-Löung oben ist keine Referenz, denn der Kollege dort verwendet auch Double, nicht Float. Hier mal als Vergleich:
edit:
Direkt aus der PHP-Doku, kommt dir das Problem bekannt vor?