Zur Info: Firebird 4.01 und Numeric(9,2)

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Joh
Lazarusforum e. V.
Beiträge: 191
Registriert: Sa 26. Mai 2012, 17:31
OS, Lazarus, FPC: Win 10 (L 2.2.6 x64 FPC 3.2.2)
CPU-Target: 64Bit

Zur Info: Firebird 4.01 und Numeric(9,2)

Beitrag von Joh »

Moin,

ich hatte für ein Feld ePreis in der Tabelle Rechnungspositionen in Firebird den Datentyp

Code: Alles auswählen

Numeric(9,2)
gewählt...
Welch ein Graus. Aus irgendeinem Grund wird der eingegebene Betrag 205,34 in 205,35 gespeichert. 205,33 in 205,34, 205,35 in 205,36...
Das passiert nur, wenn der Betrag geändert wird; bei Änderung z.B. der Menge bleibt der Betrag erhalten.

Ganz knapp vor der Allgemeinen Verzweifelung habe ich in der Datenbank den Datentyp in Numeric(10,3) geändert; siehe da, es paßt.
Auch beim Zurücksetzen auf Numeric(10,2) wurde der Wert richtig gespeichert.

Ein Teil der Lösung scheint zu sein, das Numeric(10,x) intern als BIGINT, Numeric(9,x) intern als INTEGER gespeichert wird:
https://firebirdsql.org/file/documentat ... edtypes-de

Ich könnte jetzt weiter testen, habe aber bereits einen Nachmittag mit dem Fehler gekämpft.
Ob der Fehler an Firebird, Firebird 4.01 (ich weiß, es gibt 4.03, aber die 4.01 ist auch beim Kunden im Einsatz) oder doch an Lazarus 2.26 liegt ist mir jetzt erstmal egal.
just my two Beer

LazarusFuchs
Beiträge: 16
Registriert: Mo 19. Aug 2013, 22:28

Re: Zur Info: Firebird 4.01 und Numeric(9,2)

Beitrag von LazarusFuchs »

Ich habe mich intensiv mit der Nummernspeicherung in Firebird beschäftigt und ein Demoprogramm dazugeschrieben unter Verwednung der Rx-Componenten.

https://lazarus.intern.es/tutorial_fire ... elder.html

Tutorial Firebird und Zeos mit Dezimalzahlen

Mit Firebird 4.0 ist unter anderem das neue Fließkommaformat DECFLOAT eingeführt worden. Ich habe mir das in Verbindung mit ZEOS angeschaut, da ich für kaufmännische Berechnungen ein Zahlenformat mit einer guten Genauigkeit benötige. In ZEOS ist DECFLOAT noch nicht implementiert und wird als "FLOAT" verwaltet.

Um genauere Zahlen zu speichern bieten sich die zwei in Firebird implemtierten Formate DECIMAL und/oder NUMERIC an. Das Format ist folgendermaßen:

NUMERIC(Gesamtzahl der Ziffern, Nachkommastellen)
DECIMAL(Gesamtzahl der Ziffern, Nachkommastellen)

Das Format ist bei beiden gleich anzugeben

Beispiel: ITEMDECIMAL8 DECIMAL(22,12) bedeutet insgesamt 22 Ziffern mit 12 Nachkommastellen, die angepasste (maximal mögliche) Zahl ist dann
123456890,123456789012. bzw. 9999999999,999999999999

Weiterführender Text ist auf der verlinkten Seite.

Antworten