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 和 5,那么小数分数可以是有限的,这当然是 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 回答