77 Stimmen

Float oder Dezimal für den Dollarbetrag der Buchhaltungsanwendung verwenden?

Wir schreiben unser Erbe neu Buchhaltungssystem in VB.NET und SQL Server. Wir haben ein neues Team von .NET/SQL-Programmierern mit der Neufassung beauftragt. Der größte Teil des Systems ist bereits fertiggestellt, wobei die Dollarbeträge mit Fließkommazahlen angegeben werden. In der Sprache des Altsystems, in der ich programmiert habe, gab es keine Fließkommazahlen, also hätte ich wahrscheinlich eine Dezimalzahl verwendet.

Was ist Ihre Empfehlung?

Sollte für Dollarbeträge der Datentyp Float oder Dezimal verwendet werden?

Was sind die Vor- und Nachteile der beiden?

Eine con erwähnt in unserem tägliches Scrum war, dass Sie vorsichtig sein müssen, wenn Sie einen Betrag berechnen, der ein Ergebnis mit mehr als zwei Dezimalstellen ergibt. Es klingt, als müssten Sie den Betrag auf zwei Dezimalstellen runden.

Eine weitere con ist, dass alle Anzeigen und gedruckten Beträge mit einem Formatanweisung die zwei Dezimalstellen anzeigt. Mir ist aufgefallen, dass dies in einigen Fällen nicht der Fall war und die Beträge nicht korrekt aussahen. (z. B. 10,2 oder 10,2546)

A pro ist, dass die reine Fließkommazahl acht Bytes auf der Festplatte benötigt, während die Dezimalzahl neun Bytes beanspruchen würde (Dezimalzahl 12,2).

7 Stimmen

Gehen Sie zurück und werden Sie Ihre Schwimmer los.

4voto

Guy Punkte 9430

Bei einem Banksystem, das ich mitentwickelt habe, war ich für den Teil "Zinsabgrenzung" des Systems verantwortlich. Jeden Tag berechnete mein Code, wie viel Zinsen für den Saldo an diesem Tag aufgelaufen (verdient) worden waren.

Für diese Berechnung war extreme Genauigkeit und Treue erforderlich (wir verwendeten FLOAT von Oracle), damit wir die "Milliardstel eines Pennys" aufzeichnen konnten, die anfallen.

Bei der "Kapitalisierung" der Zinsen (d. h. der Rückzahlung der Zinsen auf Ihr Konto) wurde der Betrag auf den Cent genau gerundet. Der Datentyp für die Kontostände hatte zwei Dezimalstellen. (In Wirklichkeit war es komplizierter, da es sich um ein Mehrwährungssystem handelte, das mit vielen Dezimalstellen arbeiten konnte - aber wir rundeten immer auf den "Penny" der jeweiligen Währung). Ja - es gab "Bruchteile" von Verlusten und Gewinnen, aber wenn die Computer Zahlen aktualisierten (Geld aus- oder einzahlten), waren es immer ECHTE Geldwerte.

Dies stellte die Buchhalter, Wirtschaftsprüfer und Prüfer zufrieden.

Erkundigen Sie sich also bei Ihren Kunden. Sie werden Ihnen ihre Bank-/Buchhaltungsregeln und -praktiken mitteilen.

1 Stimmen

Ein Milliardstel eines Pennys ist 0,01^e-9 - es gibt absolut keinen Grund, hier Oracles FLOAT für "extreme Genauigkeit und Treue" zu verwenden, da es sich um eine Fließkommadarstellung handelt, die eher eine ungefähre als eine genaue Zahl ist. TSQLs DECIMAL(38,18) wäre genauer. Ohne dass Sie erklären, wie Sie die Mehrfachwährung gehandhabt haben, bin ich skeptisch, dass Sie fehlerfrei sind. Wenn die Tester vom Euro in den Simbabwe-Dollar konvertieren würden, könnten sie ein echtes Rundungsproblem feststellen.

0 Stimmen

Nur um das klarzustellen, ich habe Floats für den Zinsauflaufprozess verwendet. Für die eigentlichen Transaktionen (wenn die aufgelaufenen Zinsen ausgezahlt wurden) wurden Dezimalzahlen verwendet. Damals war das System auf eine Währung ausgerichtet. Wenn ich noch einmal die Zeit hätte, würde ich wahrscheinlich keine Gleitkommazahlen verwenden :)

0 Stimmen

4voto

David Singer Punkte 1142

Der einzige Grund, Float für Geld zu verwenden, ist, wenn Sie sich nicht um genaue Antworten kümmern.

3voto

HLGEM Punkte 91543

Ein weiterer Punkt, den Sie bei Buchhaltungssystemen beachten sollten, ist, dass niemand direkten Zugriff auf die Tabellen haben darf. Das bedeutet, dass der gesamte Zugriff auf das Buchhaltungssystem über folgende Kanäle erfolgen muss gespeicherte Verfahren .

Dies dient der Betrugsbekämpfung, nicht nur SQL-Einschleusung Angriffe. Ein interner Benutzer, der einen Betrug begehen will, sollte niemals die Möglichkeit haben, Daten in den Datenbanktabellen direkt zu ändern. Dies ist eine wichtige interne Kontrolle für Ihr System.

Wollen Sie wirklich, dass ein verärgerter Mitarbeiter auf das Backend Ihrer Datenbank zugreift und damit beginnt, ihm Schecks auszustellen? Oder verheimlichen, dass er eine Ausgabe an einen nicht autorisierten Lieferanten genehmigt hat, obwohl er keine Genehmigungsbefugnis hat? Nur zwei Personen in Ihrem Unternehmen sollten direkt auf die Daten Ihrer Finanzdatenbank zugreifen können: Ihr Datenbankadministrator (DBA) und sein Backup. Wenn Sie mehrere DBAs haben, sollten nur zwei von ihnen diesen Zugriff haben.

Ich erwähne dies, weil Ihre Programmierer, wenn sie Float in einem Buchhaltungssystem verwendet haben, wahrscheinlich mit dem Konzept der internen Kontrollen überhaupt nicht vertraut sind und sie bei ihrer Programmierung nicht berücksichtigt haben.

3voto

Peter Stuifzand Punkte 4908

Noch besser als die Verwendung von Dezimalzahlen ist die Verwendung von einfachen Ganzzahlen (oder vielleicht einer Art von Bigint). Auf diese Weise haben Sie immer die höchstmögliche Genauigkeit, aber die Präzision kann angegeben werden. Zum Beispiel die Zahl 100 könnte bedeuten 1.00 die wie folgt formatiert ist:

int cents = num % 100;
int dollars = (num - cents) / 100;
printf("%d.%02d", dollars, cents);

Wenn Sie eine höhere Genauigkeit wünschen, können Sie die 100 in einen größeren Wert ändern, z. B: 10 ^ n, wobei n die Anzahl der Nachkommastellen ist.

4 Stimmen

Dies sollten Sie tun, wenn Sie keinen guten Festpunkttyp haben. Der Vorteil ist, dass Sie bestimmen können, wo das Dezimalkomma steht, der Nachteil ist, dass Sie es vermasseln werden. Wenn Sie einen Festkomma-Typ haben, müssen Sie sich darüber keine Gedanken machen.

0 Stimmen

Das sind bereits zwei magische Zahlen, die vermutlich gleich sind.

2voto

George Punkte 161

Ich hatte den Geldtyp von SQL zum Speichern von Geldwerten verwendet. In letzter Zeit musste ich mit einer Reihe von Online-Zahlungssystemen arbeiten und habe festgestellt, dass einige von ihnen Ganzzahlen für die Speicherung von Geldwerten verwenden. In meinen aktuellen und neuen Projekten habe ich begonnen, Ganzzahlen zu verwenden, und ich bin ziemlich zufrieden mit dieser Lösung.

0 Stimmen

Ich nehme an, Sie verwenden das Verb ROUND in Ihren Verfahren?

1 Stimmen

Wenn Sie die SQL-Seite meinen, dann NEIN. Ich ziehe es vor, dass die DAL die Ganzzahl so zurückgibt, wie sie in der DB steht. In der Geschäftslogikschicht führe ich die Umwandlung durch. int cents = value % 100; int dollars = (value - cents) / 100; Mit .NET 3.5 habe ich eine Erweiterungsmethode dafür.

0 Stimmen

@Gerhard Weiss: Das klingt wie eine rhetorische Frage. Ist sie das?

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X