为什么SharpDevelop上的这个小型C#程序使用';对于';循环不起作用?
我完全是个初学者。我在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+
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;i1/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);