2

这是代码:

    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)谢谢

4

4 回答 4

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);
}
于 2012-05-21T21:47:14.440 回答
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));
}
于 2012-05-21T21:49:15.543 回答
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();
    }

另见这篇文章:.NET 上的双精度问题

于 2012-05-21T21:55:11.263 回答
1

如果可能,您应该始终使用绝对而不是迭代计算来消除这些类型的舍入错误:

public static void Main(string[] args)
{
    int xd2 = 5;

    for (int i = 0; i < 100; ++i) {
        Console.WriteLine(xd2 + i * 0.01);
    }
}
于 2012-05-21T21:52:48.403 回答