0

このコードを実行すると:

double d = 0.0;
for (int i = 0; i < 90; i++)
{
    d += .01;
    d %= 1;
    Console.WriteLine(d);
}

私は出力が

0.01
0.02
0.03
...
0.9

0.81 になるまで、そのように動作します。これは私が見る出力です:

...
0.8
0.810000000000001
0.820000000000001
...
0.900000000000001

それで、ここで何が起こっているのですか?

4

3 に答える 3

5

0.01 は小数で、1/100 です。2 進浮動小数点数は、分母が 2 のべき乗である場合、有限桁数の分数のみを表すことができます。もちろん、100 は 2 の累乗ではありません。(分母の唯一の素因数が 2 と 5 である場合、10 の素因数はもちろん 10 の素因数です。)

0.01 のバイナリ表現は無限であるため、プログラムが繰り返し加算する有限数は 0.01 と正確には等しくありません。しばらくすると、不正確さが蓄積され、フォーマットされた出力に表示されるようになります。

詳細については、 http://en.wikipedia.org/wiki/Double_precision_floating-point_formatを参照してください。

この特定のタスクを実行する最善の方法は、繰り返し加算を整数加算に変更することです。たとえば、 に変更できd += 0.01;ますd = (double)(i + 1) / 100;

于 2012-07-30T15:00:47.150 に答える
1

これを試して

double d = 0.0;
for (int i = 0; i < 90; i++)
    {
     d += .01;
     d %= 1;
     Console.WriteLine(Math.Round(d, 2));
    }

丸めのため、期待した結果が得られないと思います

于 2012-07-30T14:59:53.747 に答える
0

使用decimal

decimal d = 0.0m;
for (int i = 0; i < 90; i++)
{
    d += .01m;
    d %= 1;
    Console.WriteLine(d);
}
于 2012-07-30T15:03:47.280 に答える