解决问题时(在代码中作为注释。)if语句(显示结果)不起作用。请帮我弄清楚错误。它被编译并运行但输出没有显示。
/*
* (Calculating the Value of π ) Calculate the value of π from the infinite series
4 4 4 4 4
π = 4 – --- + --- – --- + --- – ------ + ...
3 5 7 9 11
Print a table that shows the value of π approximated by computing the first 200,000 terms of this
series. How many terms do you have to use before you first get a value that begins with 3.14159?
*/
public class ValueOfPi
{
public static void main(String[] args)
{
int i,count=0;
double pi=0.0,n=1.0,PI=3.14159;
for(i=0;i<200000;i++)
{
count++;
if(count%2!=0)
{
pi=pi+(4/n);
}
else if(count%2==0)
{
pi=pi-(4/n);
}
n=n+2;
if(pi==PI)
{
System.out.printf("terms=%d PI=%f\n",count,pi);
break;
}
}
}
}
答案 0 :(得分:3)
if语句不起作用的原因是您要比较浮点数是否相等。页面What Every Computer Scientist Should Know About Floating-Point Arithmetic解释了原因。
重新阅读OP的问题后,对于这种情况,我首先将pi的计算值转换为长度为8个或更多字符的字符串,并将前7个字符与“3.14159”进行比较。
答案 1 :(得分:0)
第一个浮点是精确的 - 两个(负)幂之和的近似值(也是3.14159),计算出的pi
可以高于或低于给定值。
同样使用%n
,因为\n
是Linux行结束,而不是\r\n
的Windows。这可能会阻止行缓冲区的刷新输出。 (不确定,我有Linux)。
if (Math.abs(pi - PI) < 1.0E-5)
{
System.out.printf("terms=%d PI=%f%n",count,pi);
break;
}
您也可以使用Math.PI
来获得更好的近似值。您现在有可能比{0}更精确pi
而不是PI
需要0.00001不精确。
使用==或太小的eps边距,如0.00000001可能会导致几乎无限循环。