Lazarus/SQLite: Rundungsfehler bei einer Münze und Wert seltener 2-Euro-Münzen

Für sonstige Unterhaltungen, welche nicht direkt mit Lazarus zu tun haben
Antworten
Gsilen
Beiträge: 1
Registriert: Fr 2. Okt 2026, 11:45

Lazarus/SQLite: Rundungsfehler bei einer Münze und Wert seltener 2-Euro-Münzen

Beitrag von Gsilen »

Moin zusammen,

ich programmiere seit ein paar Jahren ein kleines Lazarus-Tool mit einer SQLite-Datenbank, um meine Sammlung von 2-Euro-Gedenkmünzen zu verwalten (Land, Jahr, Zustand, Preis). Eigentlich nichts Kompliziertes, am Anfang einfach ein TSQLQuery, das mit einem TDBGrid verbunden ist, dazu ganz normale Felder.

Letztes Wochenende wollte ich eine Liste mit aktuellen Kursen importieren, um meine Einträge zu aktualisieren, und dann wurden die Preise im Grid nach der zweiten Nachkommastelle plötzlich völlig absurd angezeigt. Eine Münze für 12,50 wurde zum Beispiel als 12,4999999 angezeigt oder je nach Zeile irgendwie falsch gerundet.

Ich habe zwei Abende gebraucht, um herauszufinden, dass das Feld irgendwo in der Importprozedur als Double statt als Currency gecastet wurde und SQLite das Ganze seinerseits am Ende als Text gespeichert hat. Dadurch gab es bei jedem Auslesen eine doppelte und ziemlich unsaubere Konvertierung. Eigentlich ein Klassiker, aber es hat ewig gedauert, den Fehler einzugrenzen, weil er nur bei bestimmten Werten auftrat und nicht bei allen.

Franchement, eine Zeit lang dachte ich sogar, dass das Problem direkt vom Component kommt. Ausgerechnet bei einer seltenen 2-Euro-Münze aus Monaco ist mir der Rundungsfehler aufgefallen, als ich meine Werte mit dem **Wert seltener 2-Euro-Münzen** in einem Online-Katalog verglichen habe. Da ist mir die Abweichung aufgefallen und ich konnte den Fehler bis zu diesem fehlerhaften Cast zurückverfolgen.

Danach habe ich noch einen Vergleich Zeile für Zeile gemacht, um sicherzugehen, dass es wirklich am Import lag und nicht noch irgendwo anders etwas schiefgelaufen ist. Jetzt sind überall Currency-Felder drin und im Importcode versteckt sich kein Double mehr. Seitdem läuft alles problemlos.

Hatte jemand von euch schon mal so ein Problem mit SQLite und numerischen Datentypen? Vielleicht habe ich auf der Seite des Components noch irgendeine Einstellung übersehen. Kann natürlich auch einfach sein, dass ich das Ganze am Anfang falsch konfiguriert hatte.

Gruß

Benutzeravatar
Zvoni
Beiträge: 763
Registriert: Fr 5. Jul 2024, 08:26
OS, Lazarus, FPC: Windoof 10 Pro (Laz/FPC fixes)
CPU-Target: 64Bit
Wohnort: BW

Re: Lazarus/SQLite: Rundungsfehler bei einer Münze und Wert seltener 2-Euro-Münzen

Beitrag von Zvoni »

Ich glaube mich daran zu erinnern, dass es ein Rundungsthema zwischen Single und Double gibt.
Desweiteren kommt es darauf an, welchen tatsächlichen Datentyp du für die Spalte in deiner Tabelle hast.

Unabhängig davon: Wenn, du, wie in deinem Fall, Preise/Geldwerte in der DB speichern willst, würde ich Integer nehmen, und Preise/Werte als "Cent" speichern.
Bsp: "12,47 €" werden in der Datenbank "1247" (cent).
Beim speichern mal 100 (inkl. runden), beim abholen geteilt durch 100
Generell würde ich solche Sachen (z.B. Runden) immer von der DB machen lassen
Stichwort: Computed/Generated columns
Ein System sie alle zu knechten, ein Code sie alle zu finden,
Eine IDE sie ins Dunkel zu treiben, und an das Framework ewig zu binden,
Im Lande Redmond, wo die Windows drohn.

Antworten