if语句循环错误,但是编译并终止而没有错误而不显示预期结果

时间:2016-10-23 04:06:26

标签: java if-statement

解决问题时(在代码中作为注释。)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;
            }
        }
    }
}

2 个答案:

答案 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可能会导致几乎无限循环。