Typenproblem

Microhome

Erfahrenes Mitglied
Hallo zusammen,

ich habe ein hoffentlich nicht all zu schwieriges Problem und hoffe, dass ich nur ein bisschen auf dem Schlauch stehe.

Der Code

Code:
$foo = $cur-0.01;
echo "$price = $foo? ";
if ($price == $foo){
   echo "ja\n";
}
else{
   echo "nein\n";
   var_dump($price);
   var_dump($foo);
}

liefert folgendes Resultat:

Code:
3.98 = 3.98? nein
float(3.98)
float(3.98)

WARUM? 3.98 ist doch das selbe wie 3.98 oder etwa nicht?!



Vielen Dank schonmal für eure Hilfe und sonnige Grüße.
 
@yaslaw: Nur damit ich es auch verstehe.

Bedeutet das das PHP intern die "gleichen" Zahlen mit einer unterschiedlichen Anzahl von Nachkommastellen und Werten führt oder zumindest führen kann?
 
Funktioniert!

Das war mir echt neu, dass die Nachkommastellen beim selben Datentypen unterschiedlich sind, aber so habe ich wieder was dazugelernt.

Besten Dank Yaslaw.
 
@tombe
Das bedeutet, dass PHP float-Zahlen nicht direkt vergleichen kann/will/tut.
Warum genau? Das weiss ich auch nicht - ich kenne PHP als Anwender.
 
http://php.net/manual/en/language.types.float.php

Man vergleicht Floats einfach nicht auf Gleichheit aufgrund des internen Typhandlings. Entweder du benutzt [phpf]bccomp[/phpf] oder du castest die Variable als String und vergleichst sie so. Hierbei müsstest du aber sicher sein, dass sie auch immer gleich aussehen... Bei Geldbeträgen die immer gleich formatiert werden, wäre das z. B. möglich.
 
Fliesskommazahlen können halt einfach nie genau rechnen. Es gibt immer Auslöschungen von teilweise sogar signifikanten Stellen was zu Ungenauigkeiten und Rundungsfehlern führt. Aus diesem Grund ist es eigentlich in allen Sprachen so, dass man Fliesskommazahlen nie miteinander vergleichen sollte bzw. kann (auch in C/C++ nicht). Die Chance, dass die Rundungsfehler gerade bei beiden Operationen gleich sind ist verschwindend gering.
 
Zurück