java - 金額をDoubleとして格納しますが、BigDecimalを使用して値を計算します

java hibernate double bigdecimal

現在、一部のHibernateエンティティはDoublesを使用して金額を格納しています。データベースはこの値を数値(10,2)として格納します。これらの金額の倍額の計算は常にBigDecimalsを使用して計算され、エンティティ値は倍精度浮動小数点数として設定されます。

例:

Order order = new Order();
OrderLineItem line = new OrderLineItem(1.0, 450.00);
BigDecimal orderValue = BigDecimal.valueOf(line.getQty())
                        .multiply(BigDecimal.valueOf(line.getAmount()));
order.setOrderTotal(orderValue.setScale(2, ROUND_HALF_EVEN).doubleValue());


これは今のところうまくいきましたが、これが何らかの丸め誤差の潜在的なリスクがあるかどうか疑問に思っています。

考え?
答え
情報パイプラインのすべての部分がBigDecimal.valueOfを使用し、BigDecimal(double)がまったく使用されていない限り、valueOfの暗黙的な丸めが最悪の事態を防ぐ可能性があります。しかし、JPAやJDBCがnumeric(10,2)doubleの間でどのように変換されるか本当に知っていますか?そして、これは将来変更されないと確信していますか?

別のポイント:valueOfdoubleValueは中間のString表現で機能します。これは、状況によってはパフォーマンスとガベージコレクションの問題である可能性があります。

これ以外にも、doubleに関する問題の十分な例があります。右側の「関連」セクションを参照してください。または、このblogを見てください。単純なものでも大混乱を引き起こします。

したがって、状況は少しスピードを上げるようなものです。実行しないものもあれば、実行しないものもあれば、何も起こらないことを望んでいるものもあれば、理解できると思います。
関連記事

java - Java(Clojure)から書き込み、Paraviewで読み取ることができるデータ形式は何ですか?

java - MATLAB Javaクラスパスの問題

java - 2つの基準をHibernate ORする

java - コンソールJavaアプリケーションの一般的な統合テストフレームワークはありますか?

java - Java SEを使用してXMLノードを削除する

java - clojure / enliveを使用してテーブル行の属性クラスを動的に設定するにはどうすればよいですか?

java - Swingフォーカスが失われたinputverifier

java - Android:ボックスとして表示されるキャラクター

java - Javaと強力な暗号化をサポートするアーカイブを探しています[終了]

java - SOA設計でのデータアクセス層(DAL)の使用