2

私は何かに取り組んでいますが、理解できない問題があります。

double d = 95.24 / (double)100;
Console.Write(d); //Break point here

コンソール出力は (予想どおり) 0.9524 ですが、プログラムを停止した後に 'd' を見ると、0.95239999999999991 が返されます。

可能なすべてのキャストを試しましたが、結果は同じです。問題は、'd' を別の場所で使用していて、この精度の問題によってプログラムが失敗することです。

では、なぜそれを行うのですか?どうすれば修正できますか?

4

5 に答える 5

8

double の代わりにdecimalを使用します。

于 2012-05-04T15:07:54.280 に答える
6

http://en.wikipedia.org/wiki/Floating_point#Accuracy_problems

要するに、浮動小数点数は基数2の科学的記数法に相当する数で格納されるということです。小数点の前に1桁あると理解されている整数の仮数があり、これは2の整数乗になります。これにより、比較的コンパクトな形式で数値を保存できます。欠点は、基数10から基数2への変換、およびその逆の変換でエラーが発生する可能性があることです。

これを軽減するために、低光度で高精度が必要な場合は、 ;decimalの代わりにを使用してください。double10進数は128ビットの浮動小数点数型であり、範囲が狭くなりますが、非常に高精度になるように設計されています(doubleの+-1.8E308ではなく、+-79ノニリオン、7.9E28までの数値しか表現できません。ほとんどの非天文、非物理コンピュータプログラム)およびdoubleの2倍のメモリフットプリント。

于 2012-05-04T15:08:02.657 に答える
2

多くのことを説明する非常に優れた記事:すべてのコンピューター科学者が浮動小数点演算について知っておくべきことこれはC#とは関係ありませんが、一般に浮動小数点演算と関係があります。

于 2012-05-04T15:09:21.680 に答える
1

代わりに小数を使用できます。

decimal d = 95.24 / 100m;
Console.Write(d); //Break point here
于 2012-05-04T15:08:23.077 に答える
1

試す:

double d = Math.Round(95.24/(double)100, 4);

Console.Write(d);

編集: または、10 進数を使用します。私は答えを質問にできるだけ似たものにしようとしていました:)

于 2012-05-04T15:10:01.220 に答える