重複の可能性:
Javaでの金銭的価値の表現
価格値を処理するのに適したJavaタイプはどれですか?理由を教えてください。
私はそれが単に質問であることを知りません:)
私はこのタイプが「安全」でなければならないことを知っているだけです。なぜなら、ショップアプリケーションを作成したり、そのように考えたりする場合です。
ps。ベストプラクティスが必要です
そしてそれがデータベースにどのように存在するのか?
重複の可能性:
Javaでの金銭的価値の表現
価格値を処理するのに適したJavaタイプはどれですか?理由を教えてください。
私はそれが単に質問であることを知りません:)
私はこのタイプが「安全」でなければならないことを知っているだけです。なぜなら、ショップアプリケーションを作成したり、そのように考えたりする場合です。
ps。ベストプラクティスが必要です
そしてそれがデータベースにどのように存在するのか?
通貨を扱うときはBigDecimalを使用する必要があります。一部の 10 進数は浮動小数点数として正確に表現できないため、Java のネイティブ浮動小数点型は他の言語と同じ精度の問題を抱えています。これはJava 固有のものではありませんが、 10 進数値を浮動小数点数として表現する際の複雑さを説明する優れた記事です。
一般に、アプリケーションの一時的な値は常に BigDecimal を使用し、必要な場合 (永続化やユーザーへのデータ表示など) にのみ float に変換する必要があります。
気になる最小の分母の整数 (または long) (USD と EUR の場合はセント)
これは、コンピューターの浮動小数点が 10 進数値 (0.1+0.2 != 0.3) に対して本質的に不正確であるためです。
ドメインがすべてをセントで計算している間、UI でセントとメイン ドルの間で換算するだけで済みます。
個人的には、私は使用しますBigDecimal
(私の会社もそうです!)。浮動小数点値がシステムに格納される方法float
と、精度が失われる可能性があるため、double
悪い提案を検討します (これは、お金を処理するときに絶対に望ましくありません)。
金融システムを構築している場合は、独自の Java クラスを作成または使用して金額を表すことをお勧めします。
金額を保持するために使用するデータ型に関しては、long または BigDecimal です。
金額を操作するときに必要なメソッドの種類を示すMoney クラスの例を次に示します。
結果の賢明な丸めを使用するdouble
と、完全にうまく機能し、最速であるだけでなく、最も簡単に記述できます。これは、エラーなしで最大 70 兆ドルのお金を表すことができます。float
エラーなしで約 $10,000 までしか表示できないため、使用しないでください。
適切な丸めを使用する方法がわからない場合、BigDecimal
またはlong
セントの方が適している場合があります。
BigDecimalクラスを使用する必要があります。