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.

6voto

David Thornley Punkte 55244

Ein wenig Hintergrundwissen hier....

Kein Zahlensystem kann alle reellen Zahlen genau handhaben. Alle haben ihre Grenzen, und das gilt sowohl für die IEEE-Standard-Gleitkommazahl als auch für die Dezimalzahl mit Vorzeichen. Das IEEE-Gleitkommasystem ist pro verwendetem Bit genauer, aber das spielt hier keine Rolle.

Die Finanzzahlen beruhen auf jahrhundertelanger Praxis mit Papier und Stift und den damit verbundenen Konventionen. Sie sind einigermaßen genau, aber, was noch wichtiger ist, sie sind reproduzierbar. Zwei Buchhalter, die mit verschiedenen Zahlen und Sätzen arbeiten, sollten auf die gleiche Zahl kommen. Jeder Spielraum für Diskrepanzen ist ein Spielraum für Betrug.

Daher ist bei Finanzberechnungen die richtige Antwort diejenige, die dieselbe Antwort liefert wie ein CPA, der gut rechnen kann. Dies ist Dezimalarithmetik, nicht IEEE-Gleitkomma.

0 Stimmen

Ich denke, dass diese Antwort im Allgemeinen mehr Sinn macht. Ich habe mehrere ähnliche Fragen und Antworten gelesen, in denen von Genauigkeit, Rundung usw. die Rede war. Dennoch habe ich das Gefühl, dass bei diesen Antworten etwas nicht stimmt und etwas fehlt. Das Wort "reproduzierbar" scheint hier der Schlüssel zu sein

6voto

Keith Punkte 141163

Fließkommazahlen haben unerwartete irrationale Zahlen.

Zum Beispiel kann man 1/3 nicht als Dezimalzahl speichern, es wäre 0,3333333333... (und so weiter)

Fließkommazahlen werden als Binärwert und eine 2er-Potenz des Exponenten gespeichert.

1,5 wird also als 3 x 2 zur -1 (oder 3/2) gespeichert.

Mit diesen Exponenten zur Basis 2 lassen sich z. B. einige ungerade irrationale Zahlen erzeugen:

Konvertieren Sie 1,1 in einen Fließkommawert und konvertieren Sie ihn dann wieder zurück. Das Ergebnis ist etwa so: 1.0999999999989

Das liegt daran, dass die binäre Darstellung von 1,1 eigentlich 154811237190861 x 2^-47 ist, mehr als ein Double verarbeiten kann.

Mehr über dieses Thema auf mein Blog aber im Grunde genommen sind Sie mit Dezimalzahlen besser dran, wenn es um die Speicherung geht.

Auf dem Microsoft SQL-Server haben Sie die money Datentyp - dieser eignet sich in der Regel am besten für die Speicherung von Finanzdaten. Er ist auf 4 Dezimalstellen genau.

Bei Berechnungen haben Sie ein größeres Problem - die Ungenauigkeit ist nur ein winziger Bruchteil, aber wenn Sie sie in eine Potenzfunktion einsetzen, wird sie schnell signifikant.

Allerdings eignen sich Dezimalzahlen nicht besonders gut für jede Art von Mathematik - es gibt zum Beispiel keine native Unterstützung für Dezimalpotenzen.

5 Stimmen

"Irrational" ist nicht das Wort, das Sie suchen. 1/3 ist immer noch rational, aber es hat keine endliche binäre Darstellung...

0 Stimmen

Ja, ich weiß - ich bin mir nur nicht sicher, wie ich es sonst nennen soll: eine Zahl, die nicht dargestellt werden kann, ist ein bisschen zu wortreich.

0 Stimmen

Es handelt sich um Näherungswerte, aber auch Zahlen, die sich darstellen lassen, sind Näherungswerte. Eine irrationale Zahl ist eine Zahl, die durch keinen ganzzahligen Bruch dargestellt werden kann, unabhängig von der Basis. Das sind Zahlen, die zur Basis 10 dargestellt werden können, aber nicht zur Basis 2.

5voto

Mitch Wheat Punkte 287474

Verwenden Sie die SQL Server-Funktion dezimal Typ.

Nicht verwenden Geld o Schwimmer .

Geld verwendet vier Dezimalstellen und ist schneller als die Verwendung von Dezimalzahlen, sondern leidet unter einigen offensichtlichen und einigen weniger offensichtlichen Problemen mit der Rundung ( siehe diese connect-Ausgabe ).

0 Stimmen

Siehe die Antwort von @David Thornley. Es かもしれません sei, dass die Geld Der Typ entspricht am ehesten den Buchhaltungskonventionen, wie (un)genau sie auch sein mögen.

5voto

Joshua Punkte 37898

Ich würde empfehlen, 64-Bit-Ganzzahlen zu verwenden, die das Ganze in Cents speichern.

0 Stimmen

Mit dem offensichtlichen Vorbehalt, dass Teil-Cent-Werte (z. B. 0,015 $) überhaupt nicht dargestellt werden können. Eine vernünftige Einschränkung für die meisten Anwendungen.

0 Stimmen

Einfache Lösung: Speichern Sie es in Tausenden von Cents. Ich bewahre das Zeug in Millionstel der jeweiligen Währung auf.

1 Stimmen

Überprüfen Sie Ihren Überlauf. Millionstel Cents laufen bei knapp über 20 Milliarden Dollar über. Tausendstel Cents bei 20 Billionen (was akzeptabel sein kann oder auch nicht), während Cents 20 Quadrillionen sind (was ich für sicher halte).

4voto

Niall Punkte 4743

Bei Fließkommazahlen handelt es sich nicht um exakte Darstellungen, und es kann zu Präzisionsproblemen kommen, z. B. bei der Addition sehr großer und sehr kleiner Werte. Deshalb werden für Währungen Dezimaltypen empfohlen, auch wenn das Problem der Genauigkeit hinreichend selten auftritt.

Zur Verdeutlichung: Der Typ Decimal 12,2 speichert genau diese 14 Ziffern, während der Typ Float dies nicht tut, da er intern eine binäre Darstellung verwendet. Zum Beispiel kann 0,01 nicht genau durch eine Fließkommazahl dargestellt werden - die nächstliegende Darstellung ist 0,0099999998

0 Stimmen

Auch Dezimalzahlen sind nicht exakt, es sei denn, sie sind unendlich genau.

0 Stimmen

0,1 kann genau in einem Dezimalfeld gespeichert werden. Dezimalzahlen sind nicht exakt für jede Zahl sind aber genau für Die meisten (einige?) gemeinsame Geldbeträge. Manchmal.

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