was macht mein mysql da bloss??
Thomas Mang
- datenbank
0 Ludger0 Thomas Mang0 CosmoK
0 claudio
Hi
hab ne tabelle die ich hier zur vereinfachung auf 2 spalten beschränke und zwar
waren
typ
preis
in preis iss jetzt ne float zahl drin, in typ einfach n integer
befehl:
SELECT preis FROM waren WHERE typ=12
bringt mir korrekt alle Preise in der Form wie der preis sein sollte, bei den waren des types 12.
zB: 0.59
bei einer abfrage:
SELECT min(preis) FROM waren WHERE typ=12 hats mich jetzt geschockt, DENN der kleinste preis ist 0.59, aber die ausgabe war:
0.58999997377396
... ?!?
woher kommt denn dieser fehler? iss nur bei min, bei max hab ich getestet: geht ... bei anderen typen auch der fehler: min bringt mir irgendeine übertrieben lange nur annähernd genaue float zahl
Jemand ne Idee, wie ich bei nem MIN Befehl an einen _exakten_ wert kommen?
Ich befürchte, das es da ab ner gewissen Menge von Waren in den Datenbeständen zu cent-Fehlern kommen kann, was für einen Shop _äusserst_ peinlich wäre, und hier sollen sehr grosse Warenmengen übern Tisch gehen pro Bestellung ...
mysql version ist übrigens: 4.0.20 falls das wichtig ist ...
Hi,
Jemand ne Idee, wie ich bei nem MIN Befehl an einen _exakten_ wert kommen?
mit den Datentypen alles OK?
Gruss,
Ludger
mit den Datentypen alles OK?
Jou. Normaler float, kleine Tabelle. Normaler SELECT bringt korrekte Werte, SELECT mit dem Min() dazu diese Fehler
Ich geb derzeit die Befehle über phpmyadmin ein. Isses vielleicht garkein SQL Fehler, sondern einer von phpmyadmin?
Hi,
Float ist eine Fließkommazahl und besteht aus *nachdenk* Vorzeichen Mantisse und Exponenten -> d.h. das der fest eingegeben Wert wir nach einer Rechenvorschrift normalisiert und gesplitet in diese 3 Werte abgespreichert. So ergeben sich diesen minimalen rundungsfehler. Double ist eine Float mit doppelter Genauigkeit. Hat den Voteil sehr große und sehr kleine Zahlen mit vertretbaren Speichervolumen zu nutzen und die max. Ungenauigkeit läßt sich auch noch irgendwie errechnen...
MYSQL hat einen Datentyp "Decimal" - viel Spaß damit! =)
Chris
MYSQL hat einen Datentyp "Decimal" - viel Spaß damit! =)
wie konnte ich das nur immer überlesen. Das ist doch genau das was ich gebraucht hab O:)
Vielen vielen Dank :D
Grüsse
Thomas
'Moin,
SELECT min(preis) FROM waren WHERE typ=12 hats mich jetzt geschockt, DENN der kleinste preis ist 0.59, aber die ausgabe war:
0.58999997377396
... ?!?
Ist ein leidiges Problem. FLOATs sind mitunter ziemlich mühsam.
Kleiner Workaround: DECIMAL verwenden. Dann werden die Preise zumindest exakt _gespeichert_. Sobald aber mit DECIMALs gerechnet wird, hast Du dann wieder das selbe Problem, da für Berechnungen ein DECIMAL als FLOAT angesehen wird :-(
Ich empfehle hierzu folgende Lektüre:
http://dev.mysql.com/doc/mysql/en/Problems_with_float.html (leider nur in Englisch, dafür werden auch Ansätze zur Lösung beschrieben)
Grüsse
claudio