Announcement

Collapse
No announcement yet.

Interbase-Probleme mit Nachkommastellen

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Interbase-Probleme mit Nachkommastellen

    Hallo,

    ich habe eine Interbase-Datenbank zur Speicherung von Artikeldaten angelegt und die Daten aus einer Textdatei über ein selbstgeschriebenes Import-Tool eingelesen. Soweit hat alles funktioniert. Nachdem ich mir dann die Daten angeschaut habe, musste ich bei den Preisen zweimal hinschauen.

    Anscheinend hat Interbase die Preise (als DOUBLE PRECISION definiert) einwenig verändert. Plötzlich kosten ein Artikel statt 9,45 DM "nur" noch 9.449999999999999 DM. Die Veränderungen der Werte treten mehrfach, aber nicht regelmäßig auf.

    Den gleichen Erfolg habe ich übrigens auch bei Eingabe über SQL im "Interbase Interactive SQL"-Programm.

    Was soll das, und wie kann ich dies abstellen? Welchen Datentyp muss ich nehmen (mit FLOAT habe ich den selben Effekt aber bei anderen Zahlen)?

    Danke!
    Frank Schäfer

  • #2
    Hallo,

    es gibt durchaus einen Grund, warum andere Datenbanken (wie zum Beispiel der SQL Server 7) den Datentyp <b>CURRENCY</b> oder <b>MONEY</b> anbieten oder warum InterBase 6 einen INT64 unterstützt. Getreu dem Motto "<i>Ganzzahlen nimmt man zum Zählen und Gleitkommazahlen nimmt man zum Messen!</i>" ist ein DOUBLE PRECISION nicht geeignet, wenn <b>keine</b> Rundungsfehler auftreten dürfen. In meinem Buch <i>Client/Server Datenbankentwicklung mit Delphi</i> befassen sich 13 Seiten mit diesem Thema, wobei es verschiedene Lösungswege für dieses Problem gibt:

    a) DECIMAL(9,2) sorgt dafür, das der InterBase jeden Wert intern als INTEGER speichert, so dass keine Rundungsfehler auftreten können. Der Nachteil besteht darin, das der Geldbetrag auf 21.474.836,47 DM beschränkt ist.

    b) DECIMAL(15,0) speichert nur die Pfennigbeträge, so dass auch hier keine Rundungsfehler auftreten können.

    c) DECIMAL(18,2) verwendet einen 64-Bit-Integer (falls die eingesetzte Datenbankversion das unterstützt).

    d) Die Kombination von NUMERIC(15,4), EnableBCD und Currency-TFields mit 2 Nachkommastellen wird verwendet.

    P.S: Zum Beispiel ist auch der Delphi-Datentyp Currency ein 64-Bit-Integerwert, also eine Ganzzahl. Jeder Geldbetrag wird implizit mit dem Faktor 10000 multipliziert

    Comment


    • #3
      Hallo Andreas,

      vielen Dank für deine Hilfe. Mein Problem mit den Beträgen ist, dass ich bis zu 5 Nachkommastellen brauche. Hierbei komme ich dann mit DECIMAL(9,2) auf unbrauchbar kleine Beträge.

      Ich habe mir jetzt Interbase Version 6 als Beta installiert. Hier sind dann zwar die Felder groß genug (DECIMAL(18,5) reicht), nur kann ich die Tabelle dann nicht mehr mit einem TTable oder einer TQuery öffnen, da ein nicht unterstützter Feldtyp verwendet wird.

      Mit den Interbase-Express Komponenten wird zwar der Feldtyp unterstützt, es gibt jedoch massive Geschwindigkeitsverluste, und Probleme bei größeren Datenmengen (s. meine Diskussion "Speicherproblem beim Datenexport"). Ich hoffe, dass dies bis zur Freigabe der IB-Version 6 beseitigt ist.

      Wie kann ich am besten vorgehen? Was würdest du machen?

      Danke, Frank

      Comment


      • #4
        Hallo,

        wenn eine InterBase 6-Datenbank verwendet werden soll, wird wohl kein Weg an IBX oder IBObjects vorbeiführen. Da Borland die BDE als "veraltet" bezeichnet und der InterBase offiziell nicht mehr zu Borland gehört, ist es fraglich, ob die BDE selbst nochmals an die Neuheiten des InterBase 6 angepasst wird - das ist aber meine eigene, durch nichts gerechtfertigte Meinung ;-)

        Auf die Ursache und die Lösung für das Speicher- und Performance-Problem bin ich in der anderen Frage eingegangen

        Comment

        Working...
        X