如何使双打正常工作? C#

时间:2012-05-21 21:46:01

标签: c# double

以下是代码:

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

        for (double xd = (double)xd2; xd <= 6; xd += 0.01)
        {
            Console.WriteLine(xd);
        }

    }

这是输出: enter image description here

我想继续添加0.01(正如您在屏幕上看到的,有时会添加0.99999) 感谢

4 个答案:

答案 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();
    }

也请参阅此文章:Double precision problems on .NET

答案 3 :(得分:1)

如果可能的话,你应该总是使用绝对计算而不是迭代计算来摆脱这些舍入错误:

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

    for (int i = 0; i < 100; ++i) {
        Console.WriteLine(xd2 + i * 0.01);
    }
}