Gemeinsame Strategien zum Umgang mit Rundungsfehlern in währungsintensivem soft?

8

Was ist Ihr Rat an:

  1. Kompensation des akkumulierten Fehlers bei umfangreichen mathematischen Operationen für Sammlungen von Money-Objekten. Wie wird dies in Ihrem Produktionscode für Ihr Gebietsschema implementiert?
  2. Theorie hinter der Rundung in der Buchhaltung.
  3. eine Literatur zum Thema.

Ich lese gerade Fowler . Er erwähnt Geldtyp, es ist typische Struktur (int, long, BigDecimal), sagt aber nichts über Strategien.

Ältere Beiträge zum Thema Geldrundung ( hier hier ) bieten keine Details und Formalitäten, die ich brauche.

Gedanken, die ich im inet gefunden habe, beziehen sich auf "Runde halbe gerade" als die beste Art, Fehler auszugleichen.

Danke für die Hilfe.

    
Max 23.05.2017, 11:53
quelle

6 Antworten

5

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

  • Die meisten Datenbanken bieten einen dezimalen Datentyp, bei dem Sie die Anzahl der Stellen vor und nach dem Komma angeben können (die Währungen variieren auch in der Anzahl der Dezimalziffern, ich habe mit Währungen mit 0, 2, 3 Dezimalziffern gehandelt)
  • Wenn Sie mit diesen Daten umgehen und unerwartete Rundungsfehler auf der Anwendungsseite vermeiden möchten, können Sie BCD als generischer Ansatz, oder Sie können ganze Zahlen verwenden, um eine feste dezimale Notation darzustellen oder Ihre eigenen
  • zu mischen

Wenn dieses erste Problem aussortiert wird, kann keine Addition (oder Subtraktion) Rundungsfehler verursachen. Dasselbe gilt für die Multiplikation mit Integer.

Das zweite Problem, nach dem Sie Daten ohne Informationsverlust speichern und abrufen können, sind Rundungsfehler aufgrund von Division (oder Multiplikation mit nicht ganzzahligen Werten).

Wenn zum Beispiel Ihr Währungsformat 2 Dezimalstellen erlaubt und Sie eine Transaktion speichern möchten, die eine Last von 10 bis 3 gleichen Teilen ausgleicht, können Sie sie nur wie

speichern %Vor%

und

%Vor%

(Rundungsfehler)

Dies ist ein erwartetes Problem, das unabhängig von der Speicherwahl des Datentyps auftritt und das berücksichtigt werden muss, wenn Ihre Konten ausgeglichen werden sollen. Diese Situation wird hauptsächlich durch Division (oder durch Multiplikation mit Nicht-Ganzzahlen, die viele signifikante Ziffern haben) eingeführt.

Eine Möglichkeit, um 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.

BEARBEITEN: Was Literaturangaben angeht, dieses scheint interessant und nicht zu lang und betrifft ein ziemlich breites Publikum mit interessanten Szenarien .

    
Unreason 19.05.2010 09:52
quelle
4

Speichern Sie Geldwerte niemals in einem Double oder Float - verwenden Sie int oder long , da es keine Möglichkeit gibt, 0.1 genau in Binärzahlen zu speichern.

    
Robert 18.05.2010 19:47
quelle
3

Verwenden Sie die Rundung des Bankers. Du rennst auf den nächsten Pfennig.

Ссылка

Sie können dies erweitern, um stattdessen toward den nächsten Zwei-Pfennig zu runden. Also 22.5 Runden auf 22, aber 23.5 Runden auf 24. 23.1 und 22.9 beide Runde auf 23. Allerdings ist der ursprüngliche Banker-Algorithmus beliebter.

    
corsiKa 18.05.2010 19:36
quelle
3

Alles hängt von der Anwendung ab. Hoffentlich gibt es nicht zu viele Situationen, in denen gerundet werden muss. Zum Beispiel erfordert die Überweisung von Geld von einem Konto zu einem anderen keine Rundung.

In Situationen, in denen eine Rundung erforderlich ist, spielt es keine Rolle, was Sie tun, solange Sie eine Richtlinie auswählen, sie kommunizieren und sich daran halten. Zum Beispiel glaube ich, dass sich die Zinsen auf meinem Sparkonto auf den nächsten Cent reduzieren.

    
Keith Randall 19.05.2010 04:31
quelle
1

Ich habe ein wenig (ein bisschen) mit Geldbeträgen gearbeitet und war sehr neugierig auf die Strategie, die in meiner Firma verwendet wurde ...

Es stellt sich heraus, dass wir double verwenden, aber sie haben darüber nachgedacht.

Die Sache ist, dass die Beträge, mit denen wir uns beschäftigen, nicht so groß sind (sagen wir weniger als 10k) und wir höchstens 3 Nachkommastellen brauchen, für insgesamt 7 signifikante Ziffern.

Da wir 64-Bit-Software (und C ++) verwenden, bietet der double -Typ genug signifikante Ziffern für die Anzahl der Operationen, die wir damit ausführen:)

Wenn Sie mehr Präzision benötigen, gibt es Algorithmen zu verwenden (zum Beispiel beim Hinzufügen mehrerer Gelder), aber ich persönlich denke, das Herz des Problems kommt mehr von:

  • Umstellung von einem Geld auf ein anderes, was sich natürlich ändert
  • Probleme beim Drucken, wobei einige Gelder keine Dezimalstellen erfordern, andere maximal 2, usw. ...

Vielleicht könnten Sie die Operationen, die Sie gerade ausführen, erweitern?

    
Matthieu M. 19.05.2010 06:32
quelle
1

Was Sie tun sollten, hängt sehr wahrscheinlich von den Konventionen des Marktes oder der Rechtsprechung ab, in der Sie tätig sind. Wenn Sie zum Beispiel Anleihen auf dem australischen Markt preisen, müssen Sie bestimmte Zwischenoperationen auf acht Dezimalstellen runden. Der Endpreis wird mit einer bestimmten Anzahl von Dezimalstellen angegeben (3 denke ich von oben).

Wenn Sie mit einer Buchhaltungs-App zu tun haben, würde ich erwarten, dass die relevanten Rechnungslegungsstandards für Ihr rechtliches Umfeld dies möglicherweise vorschreiben.

    
James Webster 19.05.2010 11:54
quelle