以下是代码:
static void Main(string[] args)
{
int xd2 = 5;
for (double xd = (double)xd2; xd <= 6; xd += 0.01)
{
Console.WriteLine(xd);
}
}
这是输出:
我想继续添加0.01(正如您在屏幕上看到的,有时会添加0.99999) 感谢
答案 0 :(得分:14)
如果您想保持这种准确性,请使用decimal
。
浮点类型无法准确表示某些值。我建议您阅读What Every Computer Scientist Should Know About Floating-Point Arithmetic进行全面解释。
decimal xd2 = 5m;
for (decimal xd = xd2; xd <= 6m; xd += 0.01m)
{
Console.WriteLine(xd);
}
答案 1 :(得分:5)
没有。这就是双打工作的方式....尝试使用十进制代替
int xd2 = 5;
for (decimal xd = (decimal)xd2; xd <= 6; xd += 0.01M)
{
Console.WriteLine(xd);
}
如果你想坚持使用双打,但只关心小数点后两位......
int xd2 = 5;
for (double xd = (double)xd2; xd <= 6; xd += 0.01)
{
Console.WriteLine(Math.Round(xd,2));
}
答案 2 :(得分:2)
这是因为double是浮点指向并且此算法不精确。 您可以使用十进制,如下所示:
static void Main(string[] args)
{
int xd2 = 5;
for (decimal xd = (decimal)xd2; xd <= 6; xd += 0.01M)
{
Console.WriteLine(xd);
}
Console.ReadLine();
}
答案 3 :(得分:1)
如果可能的话,你应该总是使用绝对计算而不是迭代计算来摆脱这些舍入错误:
public static void Main(string[] args)
{
int xd2 = 5;
for (int i = 0; i < 100; ++i) {
Console.WriteLine(xd2 + i * 0.01);
}
}