当我运行此代码时:
double d = 0.0;
for (int i = 0; i < 90; i++)
{
d += .01;
d %= 1;
Console.WriteLine(d);
}
Run Code Online (Sandbox Code Playgroud)
我希望输出是
0.01
0.02
0.03
...
0.9
Run Code Online (Sandbox Code Playgroud)
它的行为就像它应该是0.81.这是我看到的输出:
...
0.8
0.810000000000001
0.820000000000001
...
0.900000000000001
Run Code Online (Sandbox Code Playgroud)
那么这里发生了什么?
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;.