私はlongを使って自分のクラスを通貨にしようとしていましたが、代わりにBigDecimal
を使うべきです。誰かが私を助けてくれるの? BigDecimal
をドル通貨に使用する最良の方法は、最低でもセントで小数点以下2桁未満にするなどです。BigDecimal
のAPIは膨大で、どのメソッドを使用するかわかりません。また、BigDecimal
は精度が高いですが、double
を通過するとすべてが失われるわけではありませんか? BigDecimal(24.99)
を新規作成すると、double
を使用する場合とどう違うのですか?代わりにString
を使用するコンストラクタを使用する必要がありますか?あなたがdouble
精度に制限されている場合はBigDecimalを使って通貨を扱う
答えて
を使用しているいくつかのヒントです:あなたはそれが(マネーの値は、多くの場合、これを必要とする)を提供する精度が必要な場合
- 使用
BigDecimal
計算のため。 NumberFormat
クラスを使用して表示します。このクラスは、異なる通貨の金額に関するローカリゼーションの問題を処理します。ただし、プリミティブのみを使用します。したがって、double
への変換による小さな精度の変更を受け入れることができれば、このクラスを使用することができます。NumberFormat
クラスを使用する場合は、BigDecimal
インスタンスでscale()
メソッドを使用して、精度と丸め方法を設定します。
PS:あなたが不思議に思っていた場合は、BigDecimal
is always better than double
, when you have to represent money values in Javaです。
PPS:
はBigDecimal
インスタンス
これはBigDecimal
provides constructors to take in primitive values以来、非常に簡単です、とString
オブジェクトを作成します。あなたはそれらを使用することができますpreferably the one taking the String
object。例えば、BigDecimal
インスタンス
を表示
BigDecimal modelVal = new BigDecimal("24.455");
BigDecimal displayVal = modelVal.setScale(2, RoundingMode.HALF_EVEN);
あなたがsetMinimumFractionDigits
とsetMaximumFractionDigits
方法が表示されているデータの量を制限するために呼び出して使用することができます。
NumberFormat usdCostFormat = NumberFormat.getCurrencyInstance(Locale.US);
usdCostFormat.setMinimumFractionDigits(1);
usdCostFormat.setMaximumFractionDigits(2);
System.out.println(usdCostFormat.format(displayVal.doubleValue()));
特に番号2で同意します。表示(表示用の書式設定)をモデル(BigDecimal)とは別にします。特定のデータ型を扱うカスタムjava.text.Formatを書くことができます。 –
NumberFormatではなくDecimalFormatを意味していませんか? – mk12
@ Mk12のいずれかを使用できます。 DecimalFormatは、書式設定をより詳細に制御する場合に使用されます。 NumberFormatが適用しないapplyPattern()メソッドを提供します。 –
1)、BigDecimal
Sを使用する1つの理由は、double
sから作成されたBigDecimal
秒での操作を実現することです。
2)BigDecimal
は、任意の精度整数のスケーリングされていない値と非負の32ビット整数スケールで構成され、doubleはプリミティブ型double
の値をオブジェクトにラップします。タイプDouble
のオブジェクトには、型double
3である)それは何の違い
を作るべきではありませんあなたは$と精度で何の困難を持つべきではない単一のフィールドが含まれています。それを行うための1つの方法は、ここでSystem.out.printf
BigDecimal.setScale(2, BigDecimal.ROUND_HALF_UP)
は、セントの小数点以下2桁まで切り上げたい場合に使用します。あなたが計算をするときにエラーを四捨五入することに注意してください。金額の丸めを行うときは、一貫性が必要です。すべての計算が終了したら、最後に一度丸めを行うか、計算を行う前に各値に丸めを適用します。どちらを使うかはあなたのビジネス要件に左右されますが、一般的に、最終的に丸めをすることは私にはもっと良い意味合いがあるようです。
お金の値をBigDecimal
に設定すると、String
を使用します。 double
を使用すると、末尾に浮動小数点値が付きます。これは、値がバイナリ形式で表現されている方法に関するコンピュータのアーキテクチャに起因します。double
/float
金融アプリケーションの場合、ROUND_HALF_EVENはバイアスを回避するため、最も一般的な丸めモードです。 –
偏見を避けることについての良い点。それを達成するためにそれが働いたのか分からなかった。 –
@マイケル:チップをありがとう。私はそれを知らなかった。私はバイアス/累積誤差をどのように最善に扱うのかといつも考えました。今日何か新しいことを学びました。 :) –
私はMoney Patternに関する少しの研究をお勧めします。 Martin Fowlerの著書「Analysis pattern」ではこれについてより詳しく説明しています。
用法に来public class Money {
private static final Currency USD = Currency.getInstance("USD");
private static final RoundingMode DEFAULT_ROUNDING = RoundingMode.HALF_EVEN;
private BigDecimal amount;
private Currency currency;
public static Money dollars(BigDecimal amount) {
return new Money(amount, USD);
}
Money(BigDecimal amount, Currency currency) {
this(amount, currency, DEFAULT_ROUNDING);
}
Money(BigDecimal amount, Currency currency, RoundingMode rounding) {
this.amount = amount;
this.currency = currency;
this.amount = amount.setScale(currency.getDefaultFractionDigits(), rounding);
}
public BigDecimal getAmount() {
return amount;
}
public Currency getCurrency() {
return currency;
}
@Override
public String toString() {
return getCurrency().getSymbol() + " " + getAmount();
}
public String toString(Locale locale) {
return getCurrency().getSymbol(locale) + " " + getAmount();
}
}
:
BigDecimal
とは対照的に、あなたはMoney
オブジェクトを使用して、すべての金銭を表します。大きな小数点としてのお金を表すことは、あなたがそれを表示する場所ごとにお金をフォーマットすることを意味します。ディスプレイの標準が変わったかどうかを想像してみてください。あなたはその場所全体の編集をしなければならないでしょう。 Money
パターンを使用する代わりに、お金の書式を1か所に集約します。
Money price = Money.dollars(38.28);
System.out.println(price);
この問題の1つの問題は、すべての通貨が金額の前のシンボルにデフォルトで設定されているわけではなく、間にスペースがあるわけではありません。それは、自分自身の一部でなければならないことです。 –
プリミティブ数値型は、単一の値をメモリに格納するのに便利です。しかし、double型とfloat型を使用した計算を扱う場合、丸めに問題があります。これは、メモリ表現が値に正確にマッピングされないために起こります。たとえば、二重の値は64ビットとみなされますが、Javaではすべての64ビットが使用されるわけではありません。したがって、float型またはdouble型の値を一緒に追加すると、間違った値に到達する可能性があります。
NumberFormat.getNumberInstance(java.util.Locale.US).format(num);
私はこの答えの単純さが好きですが、最終的なゼロを落とす1.50の代わりに1.5を返します。 – JesseBoyd
- 1. レールアプリの価格と通貨の扱い
- 2. 大量のデータを扱うGoogle通貨コンバータapi
- 3. Jsを使った通貨換算
- 4. PHPを使って通貨価値を追加する
- 5. BigDecimalを小数点以下3桁の通貨文字列にフォーマットする
- 6. rxjsを使ってリフレッシュトークンを扱う
- 7. 通貨
- 8. すべて基本通貨の通貨ヤフーファイナンスのKWD
- 9. Woocommerce:ajaxコールで通貨を失う
- 10. angularjsを使用した通貨コンバータ
- 11. StandardTokenizerFactoryを通貨で使用する
- 12. 間違った通貨を表示しているストライプポップアップ
- 13. iOS - NSNumberFormatterを使用して通貨を表示しない通貨を表示します。
- 14. 通貨名を通貨記号に変換
- 15. 通貨コードと通貨記号をマゼンタで表示
- 16. 通貨ライブラリ
- 17. 通貨マスク
- 18. 通貨換算
- 19. レルムスウィフト - 通貨
- 20. Javascript通貨デバイダー
- 21. 通貨レイヤーAPI
- 22. 通貨コンバータの
- 23. 通貨フォーマット
- 24. フォーマット通貨
- 25. リアルタイム通貨webservice
- 26. ISO通貨リスト
- 27. 換算通貨
- 28. WooCommerce通貨
- 29. 数値を通貨としてPython
- 30. JavaScriptを使用して通貨をフォーマットする
すべてが正常に見えるが、最後に1つの事のために短いクリップを見てください - あなたがBigDecimalのインスタンス上setScale()を使用する場合、後で追加のためにそれを使用する場合は特に、丸めを提供n + 1の係数。ここで、nは有効桁数です。たとえば、丸め係数を3に設定すると、0.043 + 0.043では0.08ではなく0.09が返されます(丸め/格納に2桁の有効数字を選択した場合)。 –
上記の例では、2桁の有効桁を選択し、加算前に丸め(中間演算として)を実行した場合、0.04 + 0.04 = 0.08を得ます。 –
価格から削除されるパーセンテージを格納する変数がBigDecimalまた? – mk12