2014-09-21 76 views
1

这是我第一次使用BigDecimal,并且遇到一些麻烦。用BigDecimal计算PI

这里是我的代码:

import java.math.BigDecimal; 

public class Test { 
    public static void main(String[] args) { 
     BigDecimal pi = new BigDecimal(4); 
     boolean plus = false; 
     for (int i = 3; i < 1000000; i += 2) { 
      if (plus) { 
       pi.add(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
      } else { 
       pi.subtract(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
      } 
      plus = !plus; 
     } 
     System.out.println(pi); 
    } 
} 

为什么它不计算PI像它应该,而是它给了我和4个答案吗?

+0

这是一个非常缓慢的收敛系列。 – 2014-09-21 23:13:38

+0

请注意,由于它收敛缓慢,因此结果可能也会出现错误。请参阅http://en.wikipedia.org/wiki/Leibniz_formula_for_%CF%80,特别是“不寻常行为”部分。 – ajb 2014-09-21 23:59:00

回答

3

你永远不会改变pi。请记住,BigDecimals的是不可变的,你永远不会改变你的,即你永远不会把它分配到一个新的价值,所以你必须有地方

pi = ... 

里面你的if/else将是一个很好的地方。

if (plus) { 
    pi = pi.add(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
} else { 
    pi = pi.subtract(new BigDecimal(4).divide(new BigDecimal(i), 2, BigDecimal.ROUND_HALF_UP)); 
} 

从第一行从BigDecimal API

不可变的,任意精度的有符号十进制数。

我也会改变2的比例更好。

+0

谢谢!但是现在我的代码总是给我3.16作为答案。 – 2014-09-21 23:08:20

+1

@ChristopherSmith:你正在使用可怕的比例值2 – 2014-09-21 23:11:06

+0

好吧,使用Integer.MAX_VALUE-1会导致内存不足异常。允许更多内存安全吗? – 2014-09-21 23:13:56