BigDecimalがJavaで金額を表すためのベストプラクティスとして推奨されていることを理解しています。あなたは何を使うのですか?代わりに使用したいより良いライブラリはありますか?
BigDecimalがJavaで金額を表すためのベストプラクティスとして推奨されていることを理解しています。あなたは何を使うのですか?代わりに使用したいより良いライブラリはありますか?
回答:
BigDecimal
はるばる。私は一部の人々が自分の作成を聞いたCash
かMoney
の通貨での現金価値をカプセル化するクラスを、しかし、皮膚の下に、それはまだだBigDecimal
、おそらくで、BigDecimal.ROUND_HALF_EVEN
丸め。
編集:ドンが彼の回答で言及しているように、timeandmoneyのようなオープンソースのプロジェクトがあり、開発者がホイールを再発明する必要がないようにしようと試みたことを称賛しますが、使用するプレアルファライブラリに十分な自信がありません実稼働環境で。さらに、内部を掘り下げると、それらも使用するBigDecimal
ことがわかります。
JodaMoneyについて知っておくと、検索エンジンでここに到着した人に役立ちます:http : //www.joda.org/joda-money/。
BigDecimal
です。
私はここで私の意見を表明していませんが、BigDecimalに対するかなり良い議論があり、誰かがおそらく捨てるべきです:
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money/
以前に遭遇した便利なライブラリーは、Joda-Moneyライブラリーです。その実装の1つは、確かにBigDecimalに基づいています。これは通貨のISO-4217仕様に基づいており、カスタマイズされた通貨リストをサポートできます(CVS経由でロードされます)。
このライブラリには少数のファイルが含まれており、変更が必要な場合にすばやく処理できます。Joda-Moneyは、Apache 2.0ライセンスの下で公開されています。
ドルとセントだけを使用している場合は、長い(小数点以下2桁のオフセット)を使用します。詳細が必要な場合は、大きな10進法が適しています。
どちらの方法でも、おそらく正しい形式を使用する.toString()を持つようにクラスを拡張し、他のメソッドが現れる可能性がある場所として配置します(長い場合、乗算と除算は、10進数が未調整)
また、独自のクラスとインターフェースを定義して使用する場合は、実装を自由に置き換えることができます。
BigDecimal
または別の固定小数点表現は、一般的にお金に必要なものです。
浮動小数点(Double
、Float
)の表現と計算は不正確であり、誤った結果をもたらします。
時間とお金を扱うときは注意が必要です。
あなたがお金で働いているとき、私は誰もがフロートやダブルを決して使用しないことを知っているべきだと思います。
しかし、BigDecimalについてはよくわかりません。
ほとんどの場合、intまたはlongでセントを追跡するだけで問題ありません。この方法では、小数点以下を処理することはありません。
ドルは、印刷するときにのみ表示されます。常に整数を使用して内部セントで動作します。分割する必要がある場合、またはMath.abs()を使用する必要がある場合、これは注意が必要です。
ただし、可能であれば、0.5セント、または100分の1セントでも構いません。これを行うにはどうすればよいかわかりません。1000分の1セントを処理してlongを使用する必要があるだけかもしれません。または多分あなたはBigDecimalを使用することを余儀なくされるでしょう
私はこれについてもっと多くの読書をするでしょうが、お金を表すためにフロートまたはダブルを使用することについて話し始めるすべての人を無視してください。彼らはただ問題を求めているだけです。
アドバイスが足りないようですので、もう少し詳しくお書きください。あなたは危険なタイプを扱っています!
より良いライブラリtimeandmoneyがあります。IMO、これらの2つの概念を表すために、JDKが提供するライブラリよりもはるかに優れています。
間違いなくBigDecimalではありません。四捨五入と表示については、非常に多くの特別なルールがあるため、注意が必要です。
Martin Fowlerは、通貨の金額を表すために専用のMoneyクラスの実装を推奨しており、通貨クラスは通貨換算のルールも実装しています。
ねえ、これはBigDecimalに関する非常に興味深い記事であり、時々doubleの代わりに使用される理由の実例です。BigDecimalチュートリアル。
最終的に通貨値を表示するときに、DecimalFormatクラスを使用できます。ローカリゼーションのサポートを提供し、かなり拡張可能です。
常に制約と詳細が含まれます。次の記事で説明する微妙な問題を理解するのに十分な経験がない人は、実際の財務データを扱う前に真剣に再検討する必要があります。
http://lemnik.wordpress.com/2011/03/25/bigdecimal-and-your-money
BigDecimalは、唯一の正しい表現またはパズルの唯一のピースではありません。特定の条件が与えられた場合、整数として格納されたセントに裏打ちされたMoneyクラスを使用することで十分であり、BigDecimalよりもはるかに高速になります。はい、それは通貨としてドルを使用することを意味し、金額を制限しますが、そのような制約は多くのユースケースで完全に受け入れられ、すべての通貨はとにかく丸めと小額の特別なケースを持っているので、「普遍的な」ソリューションはありません。