web-dev-qa-db-ja.com

Javaでの通貨価値の表現

BigDecimalは、Javaで金銭的価値を表すためのベストプラクティスとして推奨されていることを理解しています。あなたは何を使うのですか?代わりに使用したいライブラリがありますか?

91
dshaw

BigDecimalずっと。通貨で現金価値をカプセル化する独自のCashまたはMoneyクラスを作成している人がいるのを聞いたことがありますが、スキンの下ではおそらくBigDecimalであり、おそらく- BigDecimal.ROUND_HALF_EVEN 丸め。

Edit:Donが 彼の答え で言及しているように、 timeandmoney のようなオープンソースのプロジェクトがあり、開発者が車輪を再発明することを防ぐために彼らを称賛している間、私は実稼働環境でそれを使用する前のアルファ版ライブラリに十分な自信を持っていません。また、ボンネットの下を掘ると、 BigDecimalも使用します が表示されます。

76
ninesided

JodaMoneyについて知るには、検索エンジンからここに到着した人にとって便利です: http://www.joda.org/joda-money/

50

私はここで自分の意見を表明していませんが、誰かがおそらく捨てるべきだとBigDecimalに対してかなり良い議論があります:

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

14
orbfish

以前に遭遇した便利なライブラリは Joda-Money ライブラリです。その実装の1つは、実際にはBigDecimalに基づいています。通貨の ISO-4217 仕様に基づいており、カスタマイズされた通貨リスト(CVS経由でロード)をサポートできます。

このライブラリには、変更が必要な場合にすぐに通過できる少数のファイルがあります。 Joda-Moneyは、Apache 2.0ライセンスの下で公開されています。

8
Bashar

ドルとセントだけを使用している場合は、ロング(小数点以下2桁のオフセット)を使用します。さらに詳細が必要な場合は、大きな小数を使用する方法があります。

いずれにせよ、クラスを拡張して正しいフォーマットを使用する.toString()を作成し、他のメソッドを配置する場所として(おそらく、小数が調整なし)

また、独自のクラスとインターフェイスを定義する場合は、実装を自由に置き換えることができます。

7
Bill K

BigDecimalまたは別の固定小数点表現は、一般的にお金のために必要なものです。

浮動小数点(DoubleFloat)の表現と計算は不正確であり、誤った結果につながります。

3
Ken Gentle

より良いライブラリ、 timeandmoney があります。 IMO、これら2つの概念を表すためにJDKが提供するライブラリよりもはるかに優れています。

2
Dónal

Moneyクラスを作成する方法があります。 BigDecimal(またはint)を使用します。次に、通貨クラスを使用して丸め規則を定義します。

残念ながら、演算子のオーバーロードなしでは、Javaは、このような基本型を作成することを非常に不快にします。

2
Kozyarchuk

時間とお金を扱うときはとても注意する必要があります。

あなたがお金で仕事をしているとき、私は誰もがフロートやダブルを決して使用しないことを知っていることを願っています。

しかし、BigDecimalについては確信がありません。

ほとんどの場合、intまたはlongでセントを追跡するだけで問題ありません。この方法では、小数点以下の桁を扱うことはありません。

印刷するときだけドルを表示します。常に整数を使用して内部セントで動作します。 Math.abs()を分割したり使用する必要がある場合、これは難しいかもしれません。

ただし、0.5セント、あるいは100分の1セントでさえも気にするかもしれません。私はこれを行うには良い方法がわからない。 1000分の1セントを処理し、長いものを使用する必要があるかもしれません。または多分あなたはBigDecimalを使用することを余儀なくされます

私はこれについてもっと読みますが、お金を表すためにフロートまたはダブルを使用することについて話し始めるすべての人を無視します。彼らはトラブルを求めているだけです。

私のアドバイスは完了していないように感じますので、もっとアドバイスをお願いします。あなたは危険なタイプを扱っています!

2
Pyrolistical

おい、BigDecimalに関する非常に興味深い記事と、なぜ倍精度の代わりに使用されることがあるかを示す実例があります。 BigDecimalチュートリアル

1
arg20

間違いなくBigDecimalではありません。丸めと表示には特別なルールがたくさんあるので、心配する必要があります。

Martin Fowlerは、通貨額を表すために専用の Money クラスを実装することを推奨します。このクラスは通貨換算のルールも実装します。

1
lindelof

最終的に通貨値を表示するときに、DecimalFormatクラスを使用できます。ローカライズのサポートを提供し、かなり拡張可能です。

0
myanswer

常に制約と詳細が関係しています。次の記事で説明する微妙な問題を十分に理解していない人は、実際の財務データを扱う前に真剣に考え直す必要があります。

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

BigDecimalが唯一の正しい表現またはパズルの唯一のピースではありません。特定の条件が与えられた場合、整数として保存されたセントに裏付けられたMoneyクラスを使用するだけで十分であり、BigDecimalよりもはるかに高速です。はい、それは通貨としてドルを使用することを意味し、金額を制限しますが、そのような制約は多くのユースケースに完全に受け入れられ、すべての通貨にはとにかく丸めおよび小額の特別なケースがあるため、「ユニバーサル」ソリューションはありません。

0
Craig

BigDecimalをMoneyクラスにカプセル化します。Moneyクラスは、上記の誰かと同じように通貨も持っています。重要なことは、特に異なる通貨で作業する場合は、極端な量の単体テストを行うことです。また、文字列を受け取る便利なコンストラクターまたは同じことを行うファクトリメソッドを追加して、次のようなテストを作成できるようにすることをお勧めします。

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