12 Stimmen

Gemeinsame Strategien zum Umgang mit Rundungsfehlern in währungsintensiven Soft?

Wie lautet Ihr Ratschlag zu:

  1. Entschädigung der akkumulierten Fehler bei mathematischen Massenoperationen an Sammlungen von Money-Objekten. Wie ist dies in Ihrem Produktionscode für Ihr Gebietsschema implementiert?
  2. Theorie hinter der Rundung in der Buchhaltung.
  3. jede Literatur zum Thema.

Ich lese derzeit Fowler . Er erwähnt den Geldtyp und seine typische Struktur (int, long, BigDecimal), sagt aber nichts über Strategien.

Ältere Beiträge zur Geldaufrundung ( ici y ici ) bieten nicht die Details und Formalitäten, die ich brauche.

Gedanken, die ich im Internet gefunden habe, beziehen sich auf das "Abrunden auf halber Höhe" als beste Möglichkeit, Fehler auszugleichen.

Danke für die Hilfe.

7voto

Unreason Punkte 12300

Bei der Erfassung von Finanzdaten gibt es viele Rundungsprobleme. Das erste Problem ist die Fähigkeit, exakte Dezimalzahlen zu speichern und abzurufen

  • die meisten Datenbanken bieten den Datentyp "Dezimal" an, bei dem Sie die Anzahl der Stellen vor und nach dem Komma angeben können (auch Währungen haben unterschiedliche Dezimalstellen, ich hatte schon mit Währungen mit 0, 2 und 3 Dezimalstellen zu tun)
  • wenn Sie mit diesen Daten arbeiten und unerwartete Rundungsfehler auf der Anwendungsseite vermeiden wollen, können Sie BCD als allgemeiner Ansatz, oder Sie können ganze Zahlen verwenden, um eine beliebige feste Dezimalschreibweise darzustellen, oder Ihre eigene mischen

Wenn dieser erste Punkt geklärt ist, kann keine Addition (oder Subtraktion) Rundungsfehler verursachen. Dasselbe gilt für die Multiplikation mit einer ganzen Zahl.

Das zweite Problem, nachdem Sie in der Lage sind, Daten ohne Informationsverlust zu speichern und abzurufen, sind erwartete Rundungsfehler aufgrund von Divisionen (oder Multiplikationen mit nicht ganzzahligen Werten).

Wenn Ihr Währungsformat z.B. 2 Dezimalstellen zulässt und Sie eine Transaktion speichern möchten, die einen Saldo von 10 in 3 gleiche Teile aufschlüsselt, können Sie dies nur wie folgt speichern

10.00  
-3.33  
-3.33  
-3.33  

et

-0.01 

(Rundungsfehler)

Dies ist ein zu erwartendes Problem, das unabhängig von der Wahl des Datentyps der Speicherung auftritt und das behoben werden muss, wenn Sie möchten, dass Ihre Konten ausgeglichen sind. Diese Situation wird hauptsächlich durch Divisionen (oder Multiplikationen mit nicht ganzzahligen Zahlen, die viele signifikante Stellen haben) verursacht.

Eine Möglichkeit, damit umzugehen, besteht darin, zu überprüfen, ob Ihre Daten nach solchen Operationen ausgeglichen sind und die zulässige Rundungsdifferenz im Gegensatz zu einer Fehlersituation zu erkennen.

EDIT: Was die Verweise auf die Literatur betrifft, diese scheint interessant und nicht zu lang zu sein und betrifft ein recht breites Publikum mit interessanten Szenarien.

4voto

corsiKa Punkte 79125

Verwenden Sie die Rundungsmethode der Bank. Sie runden auf den nächsten Zwei-Cent-Strich.

http://www.xbeat.net/vbspeed/i_BankersRounding.htm

Sie können dies zu einer Rundung ausbauen toward den nächstgelegenen Zwei-Penny-Betrag. 22,5 rundet also auf 22, aber 23,5 rundet auf 24. 23,1 und 22,9 runden beide auf 23. Der ursprüngliche Banker-Algorithmus ist jedoch beliebter.

4voto

Robert Punkte 8048

Speichern Sie niemals Geldwerte in einem Double oder Float - verwenden Sie ein int ou long da es keine Möglichkeit gibt, 0,1 genau im Binärformat zu speichern.

3voto

Keith Randall Punkte 22725

Das hängt ganz von der Anwendung ab. Hoffentlich gibt es nicht zu viele Situationen, in denen eine Rundung erforderlich ist. Wenn Sie beispielsweise Geld von einem Konto auf ein anderes überweisen, ist keine Rundung erforderlich.

In Situationen, in denen eine Rundung erforderlich ist, ist es eigentlich egal, was Sie tun, solange Sie sich für eine Strategie entscheiden, diese kommunizieren und sich daran halten. Ich glaube zum Beispiel, dass die Zinsen auf meinem Sparkonto auf den nächsten Penny abgerundet werden.

2voto

James Webster Punkte 3958

Was Sie tun sollten, hängt möglicherweise von den Gepflogenheiten des Marktes oder der Rechtsordnung ab, in dem Sie tätig sind. Bei der Preisermittlung für Anleihen auf dem australischen Markt müssen Sie beispielsweise bestimmte Zwischenoperationen auf 8 Dezimalstellen runden. Der Endpreis wird mit einer bestimmten Anzahl von Dezimalstellen angegeben (ich glaube, es sind 3, wenn ich mich recht entsinne).

Wenn es sich um eine Buchhaltungsanwendung handelt, würde ich erwarten, dass die für Ihr rechtliches Umfeld relevanten Buchhaltungsstandards dies möglicherweise vorschreiben.

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