Hallo zusammen,
habe ein grosses Problem.
Habe einen kleinen Onlineshop in PHP programmiert. Hier werden die Preise der Artikel aus einer MySQL Datenbank gezogen, und in PHP Sessions zwischengespeichert (von Artikeln im Warenkorb). Das Feld in MySQL ist als decimal 5,2 angelegt.
Irgendwann habe ich festgestellt, das PHP bei einem Preis von z.B. 0,44 Euro den Wert 0.43999999999999999953525523 in der PHP Session ablegt.
Meistens hat PHP die Werte dann später beim rechnen wieder korrekt gerundet, manchmal gab es aber auch komische effekte.
Daher bin ich hingegangen und habe die Beträge mit 100 multipliziert und mit (int) in einen Integer umgewandelt. Nun hat PHP auch die Preise in Cent sauber und korrekt in die Sessions geschrieben, und auch korrekt weiter berechnet.
Allerdings habe ich nun einen Artikel, der kostet 0,29 Euro. Sobald ich dieses (und das funktioniert eben NUR bei diesem Artikel) in den Warenkorb lege, wird er nur mit 28 Cent berechnet. 1 Cent unterschlägt mir PHP.
Habe durch debugging nun rausgefunden, das erst nach dem int der Fehler auftritt. Daher habe ich folgenden kleinen Test programmiert:
for($i=0.00;$i<5;$i=$i+0.01)
{
echo "I = $i<br>";
echo "INT(i) = " . (int)(($i)*100) . "<br>";
echo "INTVAL(i) = " . intval($i*100) . "<br><br>";
}
Und das kuriose ist:
So ertwarte ich das ergebnis:
I = 1.83
INT(i) = 183
INTVAL(i) = 183
I = 1.84
INT(i) = 184
INTVAL(i) = 184
I = 1.85
INT(i) = 185
INTVAL(i) = 185
I = 1.86
INT(i) = 186
INTVAL(i) = 186
Irgendwann fängt aber PHP an sich zu verrechnen, und dann kommt sowas raus:
I = 2.84
INT(i) = 283
INTVAL(i) = 283
I = 2.85
INT(i) = 284
INTVAL(i) = 284
I = 2.86
INT(i) = 285
INTVAL(i) = 285
I = 2.87
INT(i) = 286
INTVAL(i) = 286
Kann mir das irgend jemand erklären????
Bzw. brauche ich eine Lösung für mein Problem. Dachte durch das Umrechnen in Cent und "int-en" hätte ich meine Rechnenfehler gelöst, aber war leider noch nichts :-(
Bin für jeden Tip dankbar!
Gruß
lelleck