1

私はコードを持っていますが、それを理解していません。精度が非常に重要なアプリケーションを開発しています。しかし、それは.NETにとって重要ではありません、なぜですか?知らない。

double value = 3.5;
MessageBox.Show((value + 1 * Math.Pow(10, -20)).ToString());

しかし、メッセージボックスには次のように表示されます。3.5助けてください、ありがとう。

4

5 に答える 5

3

精度が非常に重要な場所で何かをしている場合は、浮動小数点の制限に注意する必要があります。良い参考資料は、DavidGoldbergの「すべてのコンピューター科学者が浮動小数点演算について知っておくべきこと」です。

浮動小数点では十分な精度が得られず、10進型で作業する必要がある場合があります。ただし、これらは常に浮動小数点よりもはるかに低速です。これは、精度と速度の間のトレードオフです。

于 2009-05-16T21:13:29.697 に答える
2

aの精度Doubleは15桁(内部では17桁)です。計算する値Math.Powは正しいですが、それに追加するとvalue、違いを生むには小さすぎます。

編集:
Decimalはその精度を処理できますが、計算は処理できません。その精度が必要な場合は、計算を実行してから、各値をaDecimalに変換してから、それらを合計する必要があります。

double value = 3.5;
double small = Math.Pow(10, -20);

Decimal result = (Decimal)value + (Decimal)small;

MessageBox.Show(result.ToString());
于 2009-05-16T20:16:36.150 に答える
1

または、doubleではなくDecimalタイプを使用します。

于 2009-05-16T20:15:24.780 に答える
1

精度を上げることはできますが、それは他に何をしたいかによって異なります。コンソール アプリケーションに以下を配置すると、次のようになります。

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 のみを使用することに注意してください。

double Pow(double x, double y);

そのため、10 進数のサインを取得することはできません (それ以外の場合は、2 倍に変換することによって)。

この質問も参照してください。

于 2009-05-16T20:29:50.923 に答える
0

倍精度とは、15〜16桁を保持できることを意味します。3.5 + 1e-20=21桁。二重精度で表すことはできません。10進数などの別のタイプを使用できます。

于 2009-05-16T20:18:18.160 に答える