繁体   English   中英

如何遍历X和Y的每种可能组合

[英]How iterate through every possible combination of X and Y

我试图遍历X和Y的所有组合。我将值增加0.01,这是两倍,但实际上从未达到0。

for (double x = -50; x < 50; x += 0.01)
{
     for (double y = -50; y <50; y += 0.01)
     {
          //Some code
     }
}

知道为什么会这样吗? 我假设这与“ double”有关,如果可以,我可以用什么替代?

更新:我将其更改为十进制,并将所有十进制数字更改为末尾带有“ m”。 现在一切正常,我爱你们:D

该代码现在显示为-

for (decimal x = -50; x < 50; x += 0.01m)
{
      for (decimal y = -50; y < 50; y += 0.01m)
      {
            // Some code
      }
}

我怀疑您正在测试零,如下所示:

if (x == 0.0) {
    // it is zero.
}

由于浮点舍入错误,这很可能失败。

浮点数的属性之一是,它们没有很多十进制数的精确表示形式。 在这种情况下,您会发现0.01的最接近表示形式有很小的“偏离”。 因此,当您将0.01添加到-50.0五千次时,结果不完全是0.0

您需要测试x是否为零,加上/减去一些小误差; 在这种情况下,例如0.00001应该可以。

更好的是,您可以通过将循环变量声明为整数,然后将其除以0.01来获得xy值,从而避免整个舍入问题。 例如

for (int i = -5000; i < 5000; i++) {
    double x = i / 0.01d;
    // etcetera

事实上,因为你的代码是使用0.01而不是0.01d ,我认为,在表示该错误将是比它应该是更多...

由于四舍五入/截断错误,不可能将值0.01精确地存储为双精度。 这样,将它们中的几个加在一起会增加错误的幅度,有可能使它错过0。相反,请尝试使用十进制类型或对int进行迭代。

问题是计算机中的浮点数通常不能完全代表十进制值,而只能近似地表示它们。 您可以查看有关浮点数的Wiki文章以了解更多详细信息。

如果使用以下代码,则您拥有的代码会更好地工作:

for (int idxX = -5000; idxX < 5000; idxX += 1)
{
    double x = (double) idxX / 100.0;

    for (int idxY = -5000; idxY < 5000; idxY += 1)
    {
        double y = (double) idxY / 100.0;

        //Some code
    }
}

这避免了浮点数的一些问题。

试试这个技巧:

for (int x = -5000; x < 5000; x++)
    {
         for (int y = -5000; y <5000; y++)
         {
              System.out.println((double)x/100.0+" ~~ "+(double)y/100.0);
         }
    }

问候,

请改用小数。 然后您将命中0。用double计算会给您舍入误差

在大多数C衍生语言中, doublefloat是具有以2为底的幂的数字 这意味着它本身与十进制数几乎没有关系,并且不一定总是精确地存储它们,而只是存储一个近似值。

解决方案是使用以10为底的幂,幸运的是,C#具有一种具有以下属性的类型: decimal decimal替换double ,您可能会很好。

这个怎么样:

if (x == (.01-.01)){}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM