2012-03-31 4 views
7

Ich habe recherchiert und festgestellt, dass im Umgang mit Währung, der beste Weg, um Berechnungen zu tun ist durch die BigDecimal Klasse.BigDecimal und Geld

In diesem Sinne arbeite ich an einem Code, der verschiedene Arten von Devisen in US-Währung umwandelt und umgekehrt (genauer gesagt, ein Kassenregister, das ausländische Währung und konvertiert es in US-Geld, berechnet die Änderung und gibt diesen Betrag in Fremdwährung an den Kunden zurück.

Ab sofort verwenden viele der Methoden double und zwei von ihnen in int als Parameter für die Berechnung der US-Währung verwendet werden.

Frage:

Da ich die BigDecimal Klasse in meinen Berechnungen verwenden möchten, sollte ich alle meine Methoden ändern, die Berechnungen mit Doppel zu einem BigDecimal machen?

+2

Ja, das klingt nach einer großartigen Idee. 1+, um die Verwendung von Fließkommazahlen zu vermeiden. –

+0

Ein anderer praktischer Ansatz zum Rechnen mit Geld ist Rationals. Sie haben "unbegrenzte" Präzision, sind stabil und auch schneller als BigDecimal. – Neet

Antwort

4

Ja, Sie sollten alle Floats oder Doubles ändern, um entweder Ints, Longs oder BigDecimals zu nehmen.

Floats und Doubles sind nicht präzise für finanzielle Berechnungen. Es ist eine sehr gute Idee, das Money Muster zu verwenden, um mit Beträgen und Währungen umzugehen (es ist eine spezielle Art von Quantity). Um eine Liste der Gelder zu verwalten, die möglicherweise in mehreren Währungen geführt werden, verwenden Sie eine , eine Sammlung von Money, die dann alle Werte einer Zielwährung summieren kann und eine CurrencyExchangeService (Währungsumrechnungskurse sollten auch als BigDecimals gespeichert werden).

Die Rundung sollte nach jeder Operation entsprechend der Anzahl der gewünschten Nachkommastellen und des Rundungsalgorithmus durchgeführt werden. Die Anzahl von Dezimalstellen ist normalerweise eine Eigenschaft von Currency (siehe z. B. ISO 4217); es sei denn, eine andere Nummer ist gewünscht (z. B. bei Benzinpreisen).

Sie sollten auf jeden Fall Fowlers Beispiele betrachten; aber ich habe auch eine sehr einfache Uni-Währung Money Klasse für eine exercise erstellt. Es verwendet nur Dollar und rundet auf 2 Dezimalstellen; aber es ist immer noch eine gute Basis für zukünftige Erweiterungen.

+0

Manchmal erfordern Finanzberechnungen noch ausgeklügeltere Ansätze. Z.B. Ein typischer Fall ist die Trennung eines Betrages in n% und (100-n)% Teile, so dass die Summe der Teile trotz Rundung perfekt ist. – 9000

+0

@ 9000: Ja, Fowler hat einen Zuweisungsalgorithmus dafür beschrieben, schauen Sie sich PoEAA an; Ich habe es auch vorher mit großem Erfolg benutzt ... –

+0

@ 9000: Ich fand den Algorithmus [hier] (http://books.google.ca/books?id=Jl5rkQnbfAIC&lpg=PA489&ots=gut4bQs6FR&dq=fowler%20money%20conundrum&pg = PA494 # v = eine Seite & q & f = falsch) –

1

Ja, BigDecimal ist sicherlich der richtige Weg (Fließkomma fast nie). Auch in JDBC.

Aber das gesagt, gibt es ein Problem mit der Rundung. In einigen Fällen sind 6 Dezimalstellen in europäischer Software gesetzlich vorgeschrieben. In der Regel werden Sie bei jedem Schritt 2 Plätze einnehmen. Wenn Sie eine Menge mit 2 Dezimalstellen und einem Preis haben, erhalten Sie 4 Dezimalstellen und müssen runden. Um die hässliche BigDecimal-Schnittstelle noch hässlicher zu machen, benötigen Sie wahrscheinlich einige Hilfefunktionen (MultiplyRounded?).