質問
私は、コードを持っている、と私はそれを理解していません。私は精度が非常に重要であるアプリケーションを開発しています。それは、なぜ、.NETのために重要ではないのですか?私は知りません。
double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());
が、メッセージボックスが表示さ:3.5 私を助けてください、ありがとうございます。
解決
あなたは精度を持つことができますが、それはあなたがしたい他に何に依存します。あなたがコンソールアプリケーションで次のように置く場合:
double a = 1e-20;
Console.WriteLine(" a = {0}", a);
Console.WriteLine("1+a = {0}", 1+a);
decimal b = 1e-20M;
Console.WriteLine(" b = {0}", b);
Console.WriteLine("1+b = {0}", 1+b);
あなたが取得します。
a = 1E-20
1+a = 1
b = 0,00000000000000000001
1+b = 1,00000000000000000001
しかしPow
関数は、Mathクラスのほぼすべてのもののように、唯一のダブルスを取ることに注意します:
double Pow(double x, double y);
だから、(doubleに変換することにより、他の)小数点以下の正弦を取ることができない。
また、をhref="https://stackoverflow.com/questions/803225/when-should-i-use-double-instead-of-decimal">見ます。
他のヒント
あなたは精度が非常に重要である何かをやっている場合は、浮動小数点の限界を認識する必要があります。良いの参照ですデビッド・ゴールドバーグの「すべてのコンピュータ科学者は、浮動小数点演算について知っておくべきこと「を。
あなたは浮動小数点はあなたに十分な精度が得られないと、あなたがdecimal型で作業する必要があることがあります。これらは、しかし、常に浮動小数点よりもはるかに遅いです - それは精度と速度の間のトレードオフです。
。 Double
の精度は15桁(内部17桁)です。あなたはMath.Pow
で計算した値が正しいですが、あなたはそれをvalue
に追加するときだけで違いを確認するためには小さすぎる。
編集:
10進その精度はなく、計算を処理することができます。あなたはその精度が必要な場合は、計算を行う必要があり、それらを一緒に追加する前にDecimal
に各値を変換します:
double value = 3.5;
double small = Math.Pow(10, -20);
Decimal result = (Decimal)value + (Decimal)small;
MessageBox.Show(result.ToString());
または進するを使用ダブルではなく、入力します。
倍精度それが15〜16個の数字を保持できることを意味します。 3.5 + 1E-20 = 21桁。それは、二重precicionで表現することはできません。あなたは、小数点以下のような別のタイプを使用することができます。