Java 用BigDecimal计算PI

Java 用BigDecimal计算PI,java,bigdecimal,pi,Java,Bigdecimal,Pi,这是我第一次使用BigDecimal,我遇到了一些麻烦 这是我的密码: 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

这是我第一次使用BigDecimal,我遇到了一些麻烦

这是我的密码:

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);
    }
}
import java.math.BigDecimal;
公开课考试{
公共静态void main(字符串[]args){
BigDecimal pi=新的BigDecimal(4);
布尔加号=假;
对于(int i=3;i<1000000;i+=2){
如果(加上){
pi.add(新的BigDecimal(4).除法(新的BigDecimal(i),2,BigDecimal.四舍五入);
}否则{
pi.减法(新的BigDecimal(4).除法(新的BigDecimal(i),2,BigDecimal.四舍五入);
}
加号=!加号;
}
系统输出println(pi);
}
}

为什么它不像它应该的那样计算π,而是给我一个4的答案?

你永远不会改变π。记住,大小数是不可变的,你永远不会改变你的,也就是说,你永远不会把它赋给一个新的值,所以你必须有一个地方

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));
}
从第一行开始

不可变、任意精度有符号十进制数


我也会将2的刻度改为更好的。

谢谢!但现在我的代码总是给我3.16作为答案。@ChristopherSmith:你使用了一个可怕的刻度值2Ok,使用Integer.MAX_value-1会导致内存不足异常。允许使用更多内存是否安全?@Christophermith要将pi计算到小数点后几位?@Christophermith:您还需要使用for循环停止常数。这是一个收敛速度非常慢的序列。请注意,由于收敛速度慢,结果也可能出现错误。请参阅,尤其是“异常行为”一节。