2012-05-03 16 views
2

Moneyの計算にDoubleデータ型を使用すると、askingfortroubleとなるので、代わりにDecimalを使用する必要があります。Doubleデータ型を使用してMoneyの値を転送する

私はこれを尋ねる気がしますが、計算を行うときにDecimalに変換される限り、Moneyデータを格納または転送するためにDoubleデータ型を使用すると潜在的な問題が生じる可能性がありますか?

私は古いアプリケーションを手に持っているので、私はこれを尋ねます。どこでもDoubleを使用しています。仕事を節約するために、実際に計算を行う部分だけをリファクタリングして、Doubleの代わりにDecimalを使用したいと思います。データ転送、シリアライゼーションなどのための配管コードだけが残っていれば、残りの部分は残しておきたいと思います。

答えて

4

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

+0

保存されている値がペニーに正確な値を表し、値が検索時に最も近いペニーに丸められた場合、実際に大きな数字で作業しない限り、すべての値が正確になります。使用しているフォーマットに関係なく、値が丸められる範囲を定義することが重要です。 「十進数」でも(1.0m/7.0m)* 7.0mは1.0mに等しくありません。 – supercat

-1

..のBigDecimalを使用..金銭的価値を格納する浮動小数点値を使用するはずの

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

ここでは、販売伝票を作成して3つの値すべてを保存することを前提としています。格納中は、3つの値をすべてdoubleに変換します。したがって、それは2進浮動小数点値になります。

古い販売バウチャーを再度開こうとすると、3つの値を試してみます。あなたがこれは私の経験に基づいて

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.) 

を次のように、現在、私は技術的には、この発生を説明することができません表示されることがあり、異なる値を、受信丸め変換による(二重から10進数)が起こることがあります。

また、あなただけAmountTax 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 
+0

ああ、申し訳ありません。真剣に。 Doubleは正確ではないかもしれませんが、4桁の有効数字を格納してリロードして4桁目を間違えた場合 - 倍精度浮動小数点数は15桁ですが、何かが間違っています。あなたがいつもうんざりしているように。この例は悪いです。 – TomTom

+0

@TomTom:開発者が正確にどのような丸めと変換方法を使用しているのかわかりません。これは何をすべきかです。私は言ったが、私は技術的にこのエラーを説明することはできません。しかし、小数点型に浮動小数点型を格納し、表示中に四捨五入、除算、乗算などの操作を実行しようとする場合にのみ発生します。 – Marshal

+0

です。 45.35〜25.35は壊れたルーティング方法です。 – TomTom

1

の答えはどのように多くの重要なに依存あなたが "輸送"する必要がある数字。 Decimalは28桁の数字を、Doubleは約15桁の数字を返します。したがって、あなたの値が+/- 10兆(小数点以下2桁を前提とします)の範囲にあればOKです。他の通貨を使用する場合は、小数点以下の桁数が必要になることがありますので、たとえば+/- 1000億、小数点以下は4桁です。

関連する問題