2

Moneyの計算にDouble データ型を使用する 問題が発生することを理解しているため、代わりにDecimalを使用する必要があります。

これを尋ねるのはばかげていると思いますが、計算を行うときにDecimalに変換される限り、Doubleデータ型を使用してMoney値を格納または転送するだけで問題が発生する可能性はありますか?

メンテナンスする古いアプリケーションが手元にあり、どこでもDoubleを使用しているので、これを尋ねます。作業を節約するために、実際に計算を行う部分のみをリファクタリングして、DoubleではなくDecimalを使用したいと思います。データ転送やシリアル化などの配管コードのみである残りの部分はそのままにしておきたいと思います。

4

4 に答える 4

4

doubleデータを取得するときだけでなく、にデータを保存すると、精度が低下します。いいえ、これはあなたの問題を回避しません。失われた精度を魔法のように取り戻すことはできません。

于 2012-05-03T04:30:30.477 に答える
1

答えは、「転送」する必要のある有効桁数によって異なります。Decimalは28桁、Doubleは約15桁です。したがって、値が+/- 10兆(小数点以下第2位を想定)の範囲にある場合は、問題ないはずです。他の通貨を使用する場合は、おそらく小数点以下の桁数が必要になるため、範囲は小数点以下4桁でたとえば+/-1,000億に縮小されます。

于 2012-05-03T04:54:28.670 に答える
0

金銭的価値を格納するために浮動小数点値を使用するべきではありません。

BigDecimalを使用する可能性があります。https: //blogs.oracle.com/CoreJavaTechTips/entry/the_need_for_bigdecimal

于 2012-05-03T04:43:58.630 に答える
-1

たとえば、すべての計算が10進データ型を使用して実行されると仮定して、トランザクションを挿入しています。

Amount : $45.35
 TAX   : $ 1.72
-----------------
Total  : $47.07

ここで、販売バウチャーを作成し、3つの値すべてを保存するとします。保存中に、3つの値すべてをdoubleに変換します。したがって、2進浮動値になります。

ユーザーが古い販売バウチャーを再度開こうとすると、3つの値を取得しようとします。四捨五入と変換(2進数から10進数へ)が原因で発生する可能性があります。異なる値を受け取ります。これは次のように表示される場合があります。

Amount : $45.36 (//changed)
 TAX   : $ 1.72
-----------------
Total  : $47.07 (//Total sum is as stored, but when you sum 
                 //actual values retrieved, they are different.)

これは私の経験に基づいており、現在、この発生を技術的に説明することはできません。

保管するだけの場合もありAmountますTax Rateが、それらを追加すると、顧客が持っている実際の販売バウチャーよりも合計が1セント多くなります。

Amount : $45.36  /*View after sales*/         Amount : $45.35  /*What customer's*/
 TAX   : $ 1.72                                TAX   : $ 1.72  /*voucher says:*/
-----------------                            -----------------
Total  : $47.07                               Total  : $47.07
于 2012-05-03T04:43:59.857 に答える