Geldwerte in Java darstellen

Ich verstehe, dass BigDecimal empfohlen wird, um monetäre Werte in Java darzustellen. Was benutzt du? Gibt es eine bessere Bibliothek, die du lieber verwenden möchtest?

   

Es kann für Leute nützlich sein, die hier von Suchmaschinen kommen, um über JodaMoney zu wissen: http://www.joda.org/joda-money/ .

Ich meine hier nicht meine Meinung, aber es gibt durchaus gute Argumente gegen BigDecimal, die jemand wahrscheinlich wegcasting sollte:

http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/

Eine praktische Bibliothek, die ich früher kennengelernt habe, ist die Joda-Money- Bibliothek. Eine seiner Implementierungen basiert tatsächlich auf BigDecimal. Es basiert auf der ISO-4217- Spezifikation für Währungen und kann eine benutzerdefinierte Währungsliste (geladen über CVS) unterstützen.

Diese Bibliothek verfügt über eine kleine Anzahl von Dateien, die bei Bedarf schnell bearbeitet werden können. Joda-Money wird unter der Apache 2.0-Lizenz veröffentlicht.

Wenn Sie nur Dollar und Cent verwenden, würde ich einen Long verwenden (um 2 Dezimalstellen versetzt). Wenn Sie mehr Details benötigen, können große Dezimalstellen der richtige Weg sein.

Wie auch immer, ich würde wahrscheinlich die class erweitern, um eine .toString (), die das richtige Format verwendet, und als eine Stelle, um andere Methoden, die kommen könnten setzen (Für eine lange, wird Multiplikation und Division schief gehen, wenn das Dezimal istnn nicht angepasst

Wenn Sie Ihre eigene class und Schnittstelle definieren, können Sie die Implementierung nach Belieben ersetzen.

BigDecimal oder eine andere Festkommadarstellung ist das, was allgemein für Geld benötigt wird.

Gleitkomma-Darstellungen ( Double , Float ) und Berechnungen sind ungenau, was zu errorshaften Ergebnissen führt.

Man muss im Umgang mit Zeit und Geld so vorsichtig sein.

Wenn Sie mit Geld arbeiten, hoffe ich, dass jeder weiß, dass er niemals einen Float oder ein Double verwenden soll.

Aber ich bin unsicher über BigDecimal.

In den meisten Fällen wird es Ihnen gut gehen, wenn Sie nur den Cent in einem Int oder Long verfolgen. Auf diese Weise behandeln Sie niemals eine Dezimalstelle.

Sie zeigen nur Dollar an, wenn Sie es drucken. Arbeiten Sie immer mit internen Cents mit ganzen Zahlen. Dies kann schwierig sein, wenn Sie Math.abs () teilen müssen oder müssen.

Sie können jedoch einen halben Cent oder sogar einen Hundertstel Cent auf sich nehmen. Ich weiß nicht, was das für ein guter Weg ist. Sie müssen nur mit tausendstel Cent umgehen und lange verwenden. Oder Sie müssen BigDecimal verwenden

Ich würde viel mehr darüber lesen, aber ich ignoriere jeden, der darüber redet, dass man mit einem Float oder Double Geld darstellen soll. Sie fragen nur nach Ärger.

Ich fühle, dass mein Rat nicht vollständig ist, also setze bitte mehr hinein. Sie haben es mit gefährlichen Typen zu tun!

Erstellen einer Money-class ist der Weg zu gehen. Verwenden Sie BigDecimal (oder sogar ein int) darunter. Verwenden Sie dann die Currency-class, um die Rundungskonvention zu definieren.

Leider macht das Überladen von Java durch Java es ziemlich unangenehm, solche Grundtypen zu erzeugen.

Es gibt eine bessere Bibliothek, Zeit und Geld . IMO, es ist den vom JDK zur Verfügung gestellten Bibliotheken zur Darstellung dieser 2 Konzepte weit überlegen.

Definitiv nicht BigDecimal. Es gibt so viele spezielle Regeln für die Rundung und Präsentation, um die Sie sich sorgen müssen.

Martin Fowler empfiehlt die Implementierung einer dedizierten Money- class zur Darstellung von Währungsbeträgen und implementiert auch Regeln für die Währungsumrechnung.

Hey, hier ist ein sehr interessanter Artikel über BigDecimal und ein anschauliches Beispiel dafür, warum es manchmal anstelle von Doubles verwendet wird. BigDecimal Tutorial .

Sie können die DecimalFormat-class verwenden, wenn Sie letztendlich einen Währungswert anzeigen. Es bietet Lokalisierungsunterstützung und ist ziemlich erweiterbar.

Ich würde BigDecimal in Money-class einkapseln, die auch eine Währung wie oben erwähnt hat. Wichtig ist, dass Sie sehr viele Unit-Tests durchführen und vor allem, wenn Sie mit verschiedenen Währungen arbeiten. Es ist auch eine gute Idee, wenn Sie einen Konstruktor convinient hinzufügen, der eine Zeichenfolge oder eine Factory-Methode verwendet, die das gleiche tut, damit Sie Ihre Tests so schreiben können:

  assertEquals(Money.create("100.0 USD").add("10 GBP"),Money.create("116 USD")); 

Es gibt immer Einschränkungen und Besonderheiten. Wer nicht genug Erfahrung hat, um die subtilen Probleme zu würdigen, die im folgenden Artikel beschrieben werden, sollte ernsthaft darüber nachdenken, bevor er mit realen Finanzdaten umgeht:

http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money

BigDecimal ist kaum die einzig richtige Darstellung oder das einzige Puzzleteil. Unter bestimmten Bedingungen kann die Verwendung einer Money-class, die durch als Ganzzahl gespeicherte Cents unterstützt wird, ausreichend sein und wäre viel schneller als BigDecimal. Ja, das bedeutet die Verwendung von Dollar als Währung und begrenzt die Beträge, aber solche Einschränkungen sind für viele Anwendungsfälle durchaus akzeptabel und alle Währungen haben spezielle Fälle für Rundungen und Unterbezeichnungen, so dass es keine “universelle” Lösung gibt.