C# で double を使用している人をよく見かけます。double が精度を失うことがあることをどこかで読んだことは知っています。私の質問は、いつ double を使用し、いつ decimal 型を使用する必要があるかということです。お金の計算に適した型は? (つまり、1 億ドル以上)
7 に答える
お金のために、常に小数。それが作成された理由です。
数値を正しく加算またはバランスを取る必要がある場合は、小数を使用してください。これには、財務上の保管や計算、スコア、または人々が手作業で行う可能性のあるその他の数値が含まれます。
数値の正確な値が重要でない場合は、速度を上げるためにdoubleを使用します。これには、すでに「有効桁数」が存在するグラフィックス、物理学、またはその他の物理科学の計算が含まれます。
System.Single / float -7桁
System.Double / double -15-16桁
System.Decimal / decimal-有効数字28-29桁
私が間違ったタイプ(数年前)を使用して刺されてきた方法は、大量にあります:
- £520,532.52-8桁
- £1,323,523.12-9桁
あなたはフロートのために100万で不足しています。
15桁の金額:
- £1,234,567,890,123.45
ダブルで9兆。しかし、除算と比較を行うと、より複雑になります(私は、浮動小数点と無理数の専門家ではありません。マークのポイントを参照してください)。小数と倍数を混在させると、問題が発生します。
10進数を使用すると、浮動小数点数が10進数に正確に近似しない可能性があるため、浮動小数点数を使用する数学演算または比較演算では、同じ結果が得られない場合があります。
10進数の代わりにdoubleを使用する必要があるのはいつですか?いくつかの同様のより詳細な答えがあります。
金銭的なアプリケーションdouble
の代わりに使用することは、マイクロ最適化です-それは私がそれを見る最も簡単な方法です。decimal
Decimal は正確な値です。Double は概算値です。
USD: $12,345.67 USD (Decimal)
CAD: $13,617.27 (Decimal)
Exchange Rate: 1.102932 (Double)
お金の場合: decimal
. double
メモリのコストが少し高くなりますが、時々あるような丸めの問題はありません。
お金の計算には必ず整数型を使用してください。
一見、浮動小数点型で十分に見えるかもしれないので、これはいくら強調してもしすぎることはありません。
Python コードの例を次に示します。
>>> amount = float(100.00) # one hundred dollars
>>> print amount
100.0
>>> new_amount = amount + 1
>>> print new_amount
101.0
>>> print new_amount - amount
>>> 1.0
かなり正常に見えます。
10^20
ジンバブエドルでこれをもう一度試してください。
>>> amount = float(1e20)
>>> print amount
1e+20
>>> new_amount = amount + 1
>>> print new_amount
1e+20
>>> print new_amount-amount
0.0
ご覧のとおり、ドルは消えました。
整数型を使用すると、正常に動作します。
>>> amount = int(1e20)
>>> print amount
100000000000000000000
>>> new_amount = amount + 1
>>> print new_amount
100000000000000000001
>>> print new_amount - amount
1
ビット幅以外の主な違いは、10 進数の指数の基数が 10 で、倍精度の基数が 2 であることだと思います。
http://software-product-development.blogspot.com/2008/07/net-double-vs-decimal.html