mod操作符行为

时间:2012-07-30 14:55:26

标签: c#

当我运行此代码时:

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

那么这里发生了什么?

3 个答案:

答案 0 :(得分: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;

答案 1 :(得分:1)

试试这个

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

我认为由于四舍五入,你没有得到预期的结果

答案 2 :(得分:0)

使用decimal

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