使用BigDecimal在Java中计算PI时出错

时间:2014-03-01 20:20:38

标签: java pi

我必须使用Leibniz公式计算PI,将PI计算到一定数量的小数(在变量zecimale中给出)。我不知道为什么,但BigDecimal没有一个加法或减法没有修改PI的值。

为什么会这样?

int zecimale = 0;

if (args.length > 0) {
    try {
        zecimale = Integer.parseInt(args[0]);
    } catch (NumberFormatException e) {
        System.err.println("Argument" + " must be an integer");
        System.exit(1);
    }
}

long start = System.nanoTime();
double numitor = 1;
BigDecimal numitor1 = new BigDecimal(1/numitor); 

BigDecimal pi = new BigDecimal(1);

for(int x = 0; pi.scale() <= zecimale; x++)
{
    numitor1 = new BigDecimal(1 / numitor);

    if(x % 2 == 0)
    {
       pi.add(numitor1);
    }
    else
    {
       pi.subtract(numitor1);
    }
    BigDecimal doi = new BigDecimal(2);
    numitor = numitor + 2;

    System.out.println(x);
    System.out.println(pi);
}
BigDecimal patru;
patru = new BigDecimal(4);
pi.multiply(patru);

1 个答案:

答案 0 :(得分:5)

BigDecimal是不可变的,因此无法改变它的值。 (与String相同的方式)这就是为什么所有方法都将在BigDecimal上运行返回一个新的BigDecimal作为结果

e.g。

 pi = pi.add(numitor1);

第二个问题是你在计算中使用了一个double,从而击败了使用BigDecimal的全部内容。

第一次迭代后表达式pi.scale()应该是〜53,并且ti的写入方式不会高很多。 scale只会告诉你点之后有多少小数位,而不是解决方案的准确性。

如果在一个循环中计算两个表达式,性能会更好。

你遇到的最后一个问题是,每个数字需要花费10倍的时间来计算,计算mroe比15位数(超过双倍的精度),这需要数年才能完成。