当我运行此代码时:
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
那么这里发生了什么?
答案 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);
}