Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何迭代X和Y的所有可能组合_C#_Java_For Loop_Iterator - Fatal编程技术网

C# 如何迭代X和Y的所有可能组合

C# 如何迭代X和Y的所有可能组合,c#,java,for-loop,iterator,C#,Java,For Loop,Iterator,我试图遍历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 } } for(双x=-50;x

我试图遍历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
     }
}
for(双x=-50;x<50;x+=0.01)
{

对于(double y=-50;y我怀疑您正在测试零,类似这样的东西:

if (x == 0.0) {
    // it is zero.
}
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
    }
}
这可能由于浮点舍入错误而失败

浮点数的一个属性是,它们对于许多十进制数没有精确的表示。在这种情况下,您会发现0.01的最接近表示形式是“关”所以当你把
0.01
加到
-50.0
上五千次时,结果并不完全是
0.0

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

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

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


事实上,由于您的代码使用的是
0.01
而不是
0.01d
,我认为由于舍入/截断错误,表示中的错误将超过其应有的程度…

,因此不可能将值0.01精确地存储在一个双精度中。因此,将其中的几个加在一起会增加t的大小该错误可能会使其丢失0。相反,请尝试十进制类型或迭代整数。

问题是计算机中的浮点数通常不能准确表示十进制值,它们只能近似表示。有关详细信息,请查看wiki文章

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

if (x == 0.0) {
    // it is zero.
}
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-idxX=-5000;idxX<5000;idxX+=1)
{
双x=(双)idxX/100.0;
对于(int-idxY=-5000;idxY<5000;idxY+=1)
{
双y=(双)idxY/100.0;
//一些代码
}
}
这可以避免浮点数的一些问题。

试试这个技巧:

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);
         }
    }
for(int x=-5000;x<5000;x++)
{

对于(int y=-5000;y改用十进制。然后你将达到0。使用double计算将产生舍入误差

在大多数C派生语言中,
double
float
是以2为基数的数字。这意味着它与十进制数本身几乎没有关系,并且不一定总是准确地存储它们,它表示st存储近似值

解决这个问题的方法是使用10进制幂,幸运的是,C有一种具有此属性的类型:
decimal
。将
double
替换为
decimal
,您可能就可以开始了。

这个怎么样:

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

使用十进制而不是双精度谢谢,我来试试。要不要解释一下?另外,注意括号。它们不匹配。