2013-06-02 11 views
1

在此代码:while循环之外的变量初始化没有被循环内的代码修改?

public class PiCalc { 
    public static void main(String[] args) { 
     double pi = 1.0; 
     int n = 3; 
     int denominator = 3; 
     while (n<10) { 
      if (n%2 == 0) { 
       pi += 1/denominator; 
      } 
      else { 
       pi -= 1/denominator; 
      } 
      n++; 
      denominator += 2; 
     } 
     System.out.println(4*pi + "," + n + "," + denominator); 
    } 
} 

输出是: 4.0,10,17

所以,变量n和分母的更新,因为我想要的,但Pi没有。谁能告诉我为什么?

回答

3

阅读了关于“整数除法”因为这是你在做什么:

1/(some int bigger than 1) returns 0 

其中一个int划分为int 必须返回一个int,所以舍入到0总是一个声明。

将其更改为

1.0/denominator 

(double) 1/denominator 

让你做双师。

1

1/denominator总是等于0,因为它们都是int类型 - 就像其他人提到的在int划分上提到的那样。你可能想要投入两倍来匹配你的pi变量。所以我会把if块改成这样的东西。

if (n%2 == 0) { 
    pi += 1d/(double)denominator; 
} else { 
    pi -= 1d/(double)denominator; 
} 
2

对于最佳实践的缘故,你不应该铸造denominator从int不断翻番 - 你使用它作为一个双是只有,所以它应该是一个双类型的变量。投入双打(或后退)并不是免费的。制作denominator到双会更快容易理解:

public class PiCalc { 
    public static void main(String[] args) { 
     double pi = 1.0; 
     double denominator = 3.0; 
     int n = 3; 
     while (n<10) { 
      if (n%2 == 0) { 
       pi += 1.0/denominator; 
      } 
      else { 
       pi -= 1.0/denominator; 
      } 
      n++; 
      denominator += 2.0; 
     } 
     System.out.println(4*pi + "," + n + "," + denominator); 
    } 
} 

对于这个问题,如果你要进行循环运行超过几个周期(以获得真正准确PI)你可以进一步提高表现if

public class PiCalc { 
    public static void main(String[] args) { 
     double pi = 1.0; 
     double denominator = 3.0; 
     int n = 3; 
     while (n<10000) /* get a really accurate PI */ { 
      pi -= 1.0/denominator; 
      n++; 
      denominator += 2.0; 

      pi += 1.0/denominator; 
      n++; 
      denominator += 2.0; 
     } 
     System.out.println(4*pi + "," + n + "," + denominator); 
    } 
} 
+0

我不同意。分母应该是数学上的一个整数,这就是事实。如果将它加倍,并且迭代变得足够大,其价值的准确性可能会发生变化。最好将分母保留为int,并且只在进行除法时将其更改(或分子)以加倍。 –

+0

双精度可以表示一个整数可以以完美精度表示的任何值。他们有53个尾数位!想想看。 – StilesCrisis

+0

从理论上讲,这个数字还是一个整数。如果您必须进行递归计算或大量循环才能将PI计算为接近精度,则精度漂移将很重要。 –