mySQL rechnet irgendwie anders wie ich als Mensch..?!?
Doc_McSky
- datenbank
Hallo nochmal,
jetzt habe ich ein Problem, das vielleicht keines ist, ich den berühmten Wald nicht sehe oder meine Datenbank spinnt (das wohl eher nicht...) ;-)
Folgende Ausgangslage:
Ich habe eine Tabelle in der wird ein Umsatz gespeichert. Diese Spalte mit Namen "amount" ist vom Typ Float, da es ja eine Fließkommazahl sein muss.
Auf der einen Seite gibt es in PHP einen SQL Aufruf, der mir Umsatz zubucht und die bereits errechnete Zahl auf zwei Stellen rundet.
Diese da lautet:
$q_sql = "UPDATE user SET amount=amount+".round($tprice_net, 2)." WHERE usr='".$USER["KDNR"]."'";
in einem von mir gewählten Beispiel und mittels echo Ausgabe kontrolliert wird dem amount "0" die gerundete Variable $tprice_net (in dem Fall 106.13) dazuaddiert.
Klappt prima, man glaubt es kaum, direkt in phpMyAdmin kontrolliert steht 106.13 in der Spalte. *freu
Jetzt eine andere Stelle, diese zieht wiederum Umsatz ab. Steht eigentlich dasgleiche drin, nur halt Minus statt plus, sieht dann so aus:
$q_sql = "UPDATE user SET amount=amount-".round($tprice_net, 2)." WHERE usr='".$usrnr."'";
Sieht logisch und einfach aus, ist es aber jetzt nicht mehr. :-(
Nachdem der Befehl ausgeführt wurde hat die Datenbank auch was abgezogen (es sind noch immer gemäß kontrollierter Bildschirmausgabe 106.13), ABER was da rauskommt ist:
-2,74658e-06 (ähm ist noch gleich sowas wie -0,000000274... usw, jedenfalls knapp dran an Null, was eigentlich rauskommen sollte, aber eben doch vorbei)
Was soll mir das jetzt sagen, was mache ich falsch? Kann man in SQL so nicht rechnen lassen?
Danke schonmal vorab.
Gruß
Doc
@@Doc_McSky:
nuqneH
Ich habe eine Tabelle in der wird ein Umsatz gespeichert. Diese Spalte mit Namen "amount" ist vom Typ Float, da es ja eine Fließkommazahl sein muss.
Warum muss es das? DECIMAL könnte sinnvoller sein.
Was soll mir das jetzt sagen, was mache ich falsch?
Du hast die FAQ nicht bis zum Ende gelesen.
Qapla'
Was soll mir das jetzt sagen, was mache ich falsch?
Du hast die FAQ nicht bis zum Ende gelesen.
Hmh, ja, vielen Dank. Die FAQ hatte ich dazu tatsächlich nicht bemüht.
Allerdings wäre mir das bei einer Division gar nicht so komisch vorgekommen, wusste aber gar nicht so wirklich, das der Rechner nicht in der Lage ist 1 und 1 zu addieren, naja, jedenfalls schafft er es Nährungsweise.
Jetzt muss ich noch suchen wie ich die Zahlen für mich passend gerundet in die DB bringe, trotzdem danke.
Hi!
Allerdings wäre mir das bei einer Division gar nicht so komisch vorgekommen, wusste aber gar nicht so wirklich, das der Rechner nicht in der Lage ist 1 und 1 zu addieren, naja, jedenfalls schafft er es Nährungsweise.
Float-Typen sind ein Kompromiss aus dem Wunsch Nachkommazahlen verarbeiten zu können, dem Speicherplatzverbrauch und der Geschwindigkeit beim Berechnen. Dafür sind sie eben wegen des verwendeten Binärsystems ungenauer. Und weil man diese Ungenauigkeit im Finanzwesen überhaupt nicht gebrauchen kann, gibt es eine Alternative.
Jetzt muss ich noch suchen wie ich die Zahlen für mich passend gerundet in die DB bringe, trotzdem danke.
Der Hinweis mit dem DECIMAL war nicht nur so dahingesagt. In der Tat, es hätte sogar statt "könnte sein" ein "ist" sein sollen. DECIMAL ist extra dafür geschaffen, die Rundungsprobleme eines FLOAT-Typs nicht aufkommen zu lassen.
Lo!