it-swarm.com.de

Warum ist BigDecimal der beste Datentyp für Währungen?

Ich habe diese Frage gelesen und die akzeptierte Antwort besagt, dass BigDecimal der beste Typ für die Darstellung von Währungswerten ist. Ich habe auch einige andere Fragen gesehen, die die Verwendung von großen Dezimalstellen unterstützen.

Warum ist BigDecimal der beste Typ? Ich verstehe die Relevanz von Argumenten wie präzisen Berechnungen oder Personen mit großem Vermögen nicht. Ich bin mir ziemlich sicher, dass es keine Währungen gibt, die auf die 10. Dezimalstelle runden, und fast niemand hat Geld im Wert von 8 Bytes (wenn es so lange gespeichert würde).

Bei Steuern und anderen Zwischenberechnungen kann ich sehen, wie wichtig es ist, sicherzustellen, dass Sie einen geeigneten Typ verwenden, der Werte nicht vorzeitig rundet/abschneidet, der mir jedoch auch nicht relevant erscheint, da ein Fehler von 0,0000000001 Cent auftritt Der Dollar scheint mir nicht so groß zu sein.

Möglicherweise liegt es an meinem Unverständnis über die Bedeutung der Richtigkeit von Abschlüssen. Vielleicht kann jemand auch klären, ob ein Millionstel Cent als endgültige Zahl von Bedeutung ist.

11
MxLDevs

Es kommt alles auf Präzision an, und Javas BigDecimal scheint die richtige Antwort auf dieser Plattform zu sein , weil es Ihnen die beste Unterstützung bietet Festlegen und Beibehalten einer sehr variablen Genauigkeit.

Ein Millionstel Cent ist nur 10-5 von einer Verschiebung des zu zahlenden Betrags, und es ist nicht so schwer, eine Situation zu finden, in der dieses Maß an Präzision wichtig ist.

  1. Unternehmen A wird mit fünfzig Millionen (5x10) öffentlich gehandelt6) ausstehende Aktien und ein aktueller Preis von 10 USD.
  2. Person B kauft 1 USD von Unternehmen A über einen Makler. Sie besitzen jetzt ein Zehntel einer Aktie oder ein Fünfhundertmillionstel der Gesellschaft A. (10-7).
  3. Unternehmen A wird als absurd überbewertet eingestuft, und nach einem kleinen Skandal wird ein Aktien-Swap-Kauf von Unternehmen C im Wert von 1.000 USD (10) akzeptiert3), wobei jeder Aktionär die entsprechende Anzahl erhält, die zu gleichen Teilen in bar oder in Aktien an die Aktionäre ausgezahlt wird.
  4. Wie viel Bargeld oder Aktien kann Person B bekommen? Beachten Sie, dass Person B (die in den Dreißigern ein arbeitsloser Anwalt ist) den gesamten Deal durcheinander bringen und sich möglicherweise einen Gehaltsscheck verdienen kann, indem Sie für seinen Wertverlust zuzüglich Anwaltskosten klagen, wenn Sie die Nummer falsch eingeben.

Nun, die Bewertung ist absichtlich ziemlich absurd, aber die gleichen Details "Sie müssen es richtig machen oder es explodiert", selbst wenn die Zahlen nur off um einen winzigen Betrag sind.

11
DougM

Der richtige Typ zur Darstellung von Währungswerten hängt von der Anwendung ab.

Zwei plausible Optionen sind ein Typ, der exakte Arithmetik kann, oder ein Gleitkommatyp. Bitte denken Sie an zwei Fakten:

  1. In der Gleitkomma-Arithmetik gelten übliche algebraische Identitäten (wie Kommutativität und Assoziativität) nicht mehr. Sie halten immer noch in exakter Arithmetik.

  2. In der exakten Arithmetik ist es nicht möglich, mit anderen Funktionen als Polynomen zu arbeiten, daher können wir weder die Quadratwurzel noch die Exponentialfunktionen verwenden. Gleitkomma-Arithmetik ermöglicht deren Verwendung.

In einer Double Accounting Personal Finance-Software ist eine genaue Arithmetik vorzuziehen. Wir gehen davon aus, dass sich alle erfassten Cashflows auf Null summieren werden. Da dies eine algebraische Identität ist, können wir sie nur überprüfen, wenn wir exakte Arithmetik verwenden. Hier würde die Verwendung eines Gleitkommas das gesamte Prinzip der doppelten Abrechnung unbrauchbar machen.

In einer internen Software, die von einer Clearingstelle verwendet wird, ist auch eine genaue Arithmetik obligatorisch, im Wesentlichen aus dem gleichen Grund wie zuvor. Es gibt ein Erhaltungsprinzip, so dass Cashflows immer Null ergeben sollten. Da das Programm eine Invariante algebraischer Natur erfüllen muss, muss es sich auf exakte Arithmetik stützen.

In einer Preis- oder Risikomanagementsoftware, die Methoden von mathematische Finanzen implementiert, werden komplexe Berechnungen durchgeführt, die an physikalische Simulationen erinnern, und es werden Erwartungsschätzungen berechnet. Die Natur dieses Problems erfordert die Verwendung von Gleitkommazahlen.

7
user40989

Ich werde hier eine Annahme machen, weil Sie in Ihrer Frage nicht. Warum ist Bigdecimal das Beste? Weil es besser ist als die Alternativen.

Warum ist Bigdecimal besser als Float?

Denn in einem Float kann man einen Wert wie Dezimal 0,1 nicht genau halten. Die binäre Darstellung der Dezimalzahl 0.1 wäre: binär 0,00011001100110011001100110011001. Wenn Sie sie zurück in die Dezimalzahl konvertieren, wäre dies: 0,0999999998603016138.

Jetzt möchte ich eine> = 0.1 Bedingung überprüfen und sehen, dass sie fehlschlägt .........

4
Pieter B