Frage

Ich verstehe, dass BigDecimal beste Praxis für die Darstellung von Geldwerten in Java empfohlen. Was benutzt du? Gibt es eine bessere Bibliothek, die Sie bevorzugen stattdessen verwenden?

War es hilfreich?

Lösung

BigDecimal den ganzen Weg. Ich habe von einigen gehört Leute ihre eigenen Cash oder Money Klassen zu schaffen, die einen Barwert mit der Währung zu kapseln, aber unter der Haut ist es noch ein BigDecimal, wahrscheinlich mit BigDecimal.ROUND_HALF_EVEN Runde.

Edit: Wie Don in seine Antwort , gibt es Open Source Projekte wie timeandmoney , und während ich begrüße sie für den Versuch, die Entwickler zu verhindern, dass das Rad neu erfinden, ich habe einfach nicht genug Vertrauen in einer Pre-alpha-Bibliothek in einer Produktionsumgebung zu verwenden. Übrigens, wenn Sie unter der Haube graben um, sehen Sie eine href sehen <= "http://timeandmoney.svn.sourceforge.net/viewvc/timeandmoney/timeandmoney/trunk/src/main/java/com/domainlanguage/money /Money.java?view=markup“rel = "nofollow noreferrer"> verwenden sie BigDecimal zu .

Andere Tipps

Es kann Menschen nützlich sein, hier von Suchmaschinen Ankunft über JodaMoney wissen: http: // www .joda.org / joda-Geld / .

Ich bin zum Ausdruck nicht meiner Meinung nach hier, aber es gibt durchaus gute Argumente gegen BigDecimal, dass jemand wahrscheinlich werfen sollte:

http://lemnik.wordpress.com/2011 / 03/25 / BigDecimal-and-your-Geld /

Eine bequeme Bibliothek, die ich in früheren lief die Joda-Geld Bibliothek. Eines seiner Implementierungen ist in der Tat basiert auf BigDecimal. Es basiert auf der ISO-4217 Spezifikation für Währungen und kann eine individuelle Währungsliste (loaded unterstützen via CVS).

Diese Bibliothek verfügt über eine kleine Anzahl von Dateien, die man schnell durchlaufen kann, wenn Änderungen erforderlich sind. Joda-Geld wird unter der Apache-2.0-Lizenz veröffentlicht.

Wenn Sie nur Dollar und Cent verwenden, würde ich eine lange (Offset von 2 Dezimalstellen) verwenden. Wenn Sie weitere Einzelheiten benötigen, können große dezimal der Weg zu gehen.

So oder so, würde ich wahrscheinlich die Klasse erweitern, um eine .toString zu haben (), die das richtige Format verwendet, und als Ort andere Methoden zu setzen, die (für eine lange kommen könnten, Multiplikation und Teilungs schief gehen, wenn das Dezimalsystem ist nicht eingestellt)

Auch wenn Sie Ihre eigene Klasse und Schnittstelle definieren, dann können Sie die Implementierung nach Belieben ersetzen.

BigDecimal oder eine andere Festpunktdarstellung ist, was im Allgemeinen für Geld benötigt wird.

Gleitpunkt (Double, Float) Darstellungen und Berechnungen sind ungenau, zu fehlerhaften Ergebnissen führen.

Sie haben so vorsichtig sein, wenn mit der Zeit und Geld.

Wenn Sie mit dem Geld arbeiten, ich hoffe, jeder wissen sollte nie einen Schwimmer oder eine Doppel zu verwenden.

Aber ich bin nicht sicher BigDecimal.

In den meisten Fällen werden Sie in Ordnung sein, wenn Sie nur den Überblick über Cent halten in einem int oder lang. So kann man nie mit einer Dezimalstelle befassen.

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

Allerdings könnten Sie in der Lage einen halben Cent kümmern oder sogar ein Hundertstel Cent. Ich weiß nicht, was ist ein guter Weg, dies zu tun. Sie könnten nur mit Tausendstel Cent befassen müssen und lange nutzen. Oder vielleicht werden Sie gezwungen BigDecimal verwenden

Ich würde auf diese viel mehr lesen, aber ignorieren alle, die einen Schwimmer oder Doppel darstellen Geld über die Verwendung sprechen beginnt. Sie sind nur Ärger bringen.

Ich fühle mich meinen Rat nicht abgeschlossen ist, so setzen Sie bitte mehr, obwohl hinein. Sie sind der Umgang mit gefährlichen Typen!

eine Money-Klasse zu schaffen, ist der Weg zu gehen. Mit BigDecimal (oder sogar ein int) darunter. Dann Währungsklasse mit Rundungskonvention zu definieren.

Leider ohne Betreiber Überlastung Java macht es ziemlich unangenehm solche Grundtypen zu schaffen.

Es gibt eine bessere Bibliothek, timeandmoney . IMO, es weit überlegen die Bibliotheken durch das JDK bereitgestellt für die Darstellung dieser 2-Konzepte.

Auf jeden Fall nicht BigDecimal. Es gibt so viele spezielle Regeln für die Rundung und Präsentation, die Sie haben, um über Sorgen machen.

Martin Fowler empfiehlt die Implementierung eines dedizierten Geld Klasse Währungsbeträge darstellen, und dass auch implementiert Regeln für die Währungsumrechnung.

Hey, hier ist ein sehr interessanter Artikel über BigDecimal und ein anschauliches Beispiel dafür, warum ist es manchmal statt Doppel eingesetzt. BigDecimal Tutorial .

Sie können die DecimalFormat Klasse verwenden, wenn letztlich einen Währungswert angezeigt wird. Es bietet Lokalisierungsunterstützung und ist ziemlich dehnbar ist.

würde ich BigDecimal in Money-Klasse kapseln, die auch eine Währung hat wie jemand oben erwähnt. Wichtig ist, dass Sie eine extreme Menge von Unit-Tests zu tun und vor allem, wenn mit verschiedenen Währungen arbeiten. Auch ist es eine gute Idee, wenn Sie einen convinient Konstruktor hinzufügen, die einen String oder eine Factory-Methode nimmt, die das gleiche tut, so dass Sie Ihre Tests so etwas schreiben kann:

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

Es gibt immer Einschränkungen und Besonderheiten beteiligt. Wer ohne ausreichende Erfahrung, um die subtilen Probleme skizzierten im folgenden Artikel zu schätzen wissen sollte mit realen Finanzdaten vor Umgang ernsthaft überdenken:

http://lemnik.wordpress.com/2011/ 25.03 / BigDecimal-and-your-Geld

BigDecimal ist kaum die einzige korrekte Darstellung oder das einzige Stück des Puzzles. Unter bestimmten Bedingungen, eine Money-Klasse unter Verwendung von Cent gesichert gespeichert als eine ganze Zahl ausreichend sein könnte und würde viel schneller als BigDecimal. Ja, das bedeutet, die Verwendung von US-Dollar als Währung und Grenzen Beträge aber solche Beschränkungen sind durchaus akzeptabel für viele Anwendungsfälle und alle Währungen haben Sonderfälle für die Rundung und Unterbezeichnungen wie auch immer, so gibt es keine „universelle“ Lösung.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top