[gnucash-de] Re: Monetary data types

Christian Stimming stimming at tuhh.de
Sam Nov 13 08:30:57 EST 2004


Am Freitag, 12. November 2004 11:03 schrieben Sie:
> ich habe da mal eine Frage zu fixed precision data types unter Linux.
> Unter Windows gibt es da den DECIMAL type, der eben speziell für
> finanzielle Berechnungen eingesetzt wird, damit man im Gegensatz zu
> Floating-Points immer die gleiche Precision hat.
> Was gibt es da vergleichbares unter Linux?
> Bei GnuCash wird so was ja auch bestimmt eingesetzt.

Es gibt unter Linux/Posix-Unix keinen allgemein verwendeten Typen, der sowas 
macht!!!

Man muß sich also in jeder Software selber aus den Basistypen eine passende 
structure zusammenbauen und die dann verwenden. Die Frage ist also völlig 
berechtigt und ich habe kurzerhand mal nachgesehen, was die ganzen 
OpenSource-Programme so haben:

GnuCash
-----------
In Gnucash war seinerzeit (Mitte 2000) die Entscheidung getroffen worden, daß 
man "rationale Zahlen" benutzt, also einen ganzzahligen Zähler und Nenner, 
siehe src/engine/gnc-numeric.h:

struct _gnc_numeric {
  gint64  num;
  gint64  denom;
};

siehe auch https://cvs.gnucash.org/cgi-bin/cvsweb.cgi/gnucash/src/engine/
gnc-numeric.h?rev=1.23 -- unbedingt den CVS-HEAD branch verwenden und nicht 
die Version im 1.8.x-Branch, da in HEAD sehr viel mehr Dokumentation drin 
ist.

[Der Typ "gint64" kommt aus der glib (der glib von Gnome, nicht zu verwecheln 
mit der glibc), weil innerhalb der glib für die unterschiedlichen Plattformen 
die passenden typedefs gesetzt werden, so daß die Applikation sich bei gint64 
darauf verlassen kann, daß das überall 64 bits sind. Aber das nur am Rande.]

In Gnucash sind wir also zu rationalen Zahlen gegangen (und der code darf 
gemäß GPL gerne woanders weiterverwendet werden), aber wahrscheinlich war das 
ein overkill. Fix-Point Zahlen, also etwas Ganzzahliges mit fester 
Komma-Position, wären wahrscheinlich in der Implementierung wesentlich 
einfacher gewesen. Nichtsdestotrotz müsste man auch dabei eben alle 
arithmetischen Operationen für den neuen Typ einbauen und dabei für alle 
Möglichkeiten bei Rundungen sich die Auswahlmöglichkeiten überlegen (also ob 
die zusätzlichen Nachkommastellen beim Multiplizieren nachher gerundet werden 
oder nicht etc). Und in der Implementierung wäre ich nicht auf Anhieb so 
sicher, wie genau man das machen würde -- da man ja Binärzahlen hat, wäre es 
mit der einfachen Angabe "Nachkommastellen zur Basis 10" ja nicht erledigt, 
denn die gespeicherte Ganzzahl ist ja eine Ganzzahl zur Basis 2. Wie auch 
immer. In Gnucash gibts halt die Brüche mit einer hoffentlich vollständig 
richtigen Implementierung und die verwenden wir nun mal.

KMyMoney
-------------
Tja, offensichtlich haben die Kollegen dort das mit der GPL bereits ganz 
richtig verstanden :-) . Im Februar 2004 haben die nämlich ihrerseits den 
Umstieg von "double"-Werte zu ganzzahligen Werten gemacht, und sie haben dazu 
genau den GnuCash-Code aus gnc-numeric.h/c rüberkopiert und in eine C+
+-Klasse umgeschrieben. Wenn du also so eine Implementation mit rationalen 
Zahlen in C++ suchst, dann findest du die in kmymoney2, Klasse MyMoneyMoney 
in mymoneymoney.h.

Grisbi
------
Die Herren von der Gtk2-Konkurrenz dagegen sind noch dabei stehengeblieben, 
daß die Finanz-Werte als "double" gespeichert werden. Denen steht der Umstieg 
also noch bevor -- aber vorher müssten die sich eh noch von der französischen 
Sprache im Quelltext lösen...

QBankManager

Die einfache Applikation QBankManager, die ja nur zum schnellen Verwalten des 
HBCI-Zugangs dienen soll, benutzt intern ebenfalls nur "double"-Werte (aus 
AB_VALUE). Für den Import/Export von Daten sind "double"s wohl auch ok, denn 
Rundungsfehler bekommt man ja erst bei arithmetischen Operationen mit vielen 
dieser Werte (also z.B. beim laufenden Saldo eines Kontos).

Gruß

Christian Stimming