为什么SharpDevelop上的这个小型C#程序使用';对于';循环不起作用?

为什么SharpDevelop上的这个小型C#程序使用';对于';循环不起作用?,c#,for-loop,sharpdevelop,absolute-value,C#,For Loop,Sharpdevelop,Absolute Value,我完全是个初学者。我在SharpDevelop上写了一个小的C#程序。这是: double i, j; for(i=1; i<=30; i+=(1/60)) { for(j=1+1/60; j<=30; j+=(1/60)) { if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001) { Console.WriteLine("ln("+i+

我完全是个初学者。我在SharpDevelop上写了一个小的C#程序。这是:

double i, j;

for(i=1; i<=30; i+=(1/60))
{
    for(j=1+1/60; j<=30; j+=(1/60))
    {
        if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+i+")   ln("+j+")");
        }
    }
}

        Console.ReadKey(true);
双i,j;

对于(i=1;i我在这里看到的错误是使用1/60期望是一个表示0.0166的双精度数…它实际上是0,因为1和60都是整数,这就变成了整数除法。尝试使用1.0/60.0、1/60.0或1.0/60、1/60d或它们的任意组合,假设您的算法在数学上是正确的,这应该可以解决它

一旦修复此问题,您可能会看到大量行打印某些结果,因为您的程序在循环完成之前不会终止,即使它可能已经打印了大量数据。您可以通过添加一个标志变量(bool)来修复此问题终止外循环,中断内循环。

整数除法

1/60 = 0
您需要
1/60.0d

当你除以一个整数时,你会得到一个整数结果。整数不能存储小数

当您执行
1/60
时,您期望
0.016667
但实际上是0

这个代码现在可以工作了

double i, j;

for(i=1; i<=30; i+=(1/60d))
{
  for(j=1+1/60d; j<=30; j+=(1/60d))
  {
      if(Math.Abs(Math.Log(i)/Math.Log(j)-0.63092975357)<=0.00001) 
          Console.WriteLine("ln("+i+")   ln("+j+")"); 
  }
}
双i,j;

对于(i=1;i
1/60
执行,结果总是生成
0
。它总是丢弃小数部分

当你除以两个整数时,结果总是一个整数 例如,7/3的结果是2

这就是为什么你的第一个for循环会是这样的

for(i = 1; i <= 30; i += 0)

除此之外,我建议您阅读Eric Lippert的文章,您可以轻松找到代码中的错误,而无需在此询问。

您可以通过保留循环和整数,然后在日志函数需要时计算出双倍数,从而使您的生活更轻松

另外,通过在ReadKey之前添加Console.Write(),您可以看到循环何时完成

for(var i=1; i<=1800; i++)
{
    for(var j=1; j<=1800; j++)
    {
        double di = double(i)/60.0; 
        double dj = double(j)/60.0;

        if(Math.Abs((Math.Log(di)/Math.Log(dj))-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+di+")   ln("+dj+")");
        }
    }
}

Console.WriteLine("Press any key to continue");
Console.ReadKey(true);

用于(var i=1;iI建议在第一个
循环上设置一个断点,逐步检查它,看看会发生什么。不确定为什么会被否决,你的问题很明显。请参阅我的答案了解详细信息。首先,你需要获得一组你知道应该产生所需结果的值。然后检查你的公式。如果它确实有效,问题就很明显了在
i
中,
j
值。如果没有,那么修复公式。重复。我同意的可能重复。让我详细说明Alex的答案-文字(数字)是根据它们所代表的内容进行编译的(您的案例:60是一个整数。如果您使用“.”编写60d或60,您会让编译器知道您的意思是60的双精度值。@是否至少要注释一下,以便我知道我可能错在哪里?
for(var i=1; i<=1800; i++)
{
    for(var j=1; j<=1800; j++)
    {
        double di = double(i)/60.0; 
        double dj = double(j)/60.0;

        if(Math.Abs((Math.Log(di)/Math.Log(dj))-0.63092975357)<=0.00001)
        {
            Console.WriteLine("ln("+di+")   ln("+dj+")");
        }
    }
}

Console.WriteLine("Press any key to continue");
Console.ReadKey(true);