Thomas Mang: was macht mein mysql da bloss??

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 ...

  1. Hi,

    Jemand ne Idee, wie ich bei nem MIN Befehl an einen _exakten_ wert kommen?

    mit den Datentypen alles OK?

    Gruss,
    Ludger

    1. 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?

    2. 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

      1. 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

  2. '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