我必须使用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);
答案 0 :(得分:5)
BigDecimal是不可变的,因此无法改变它的值。 (与String相同的方式)这就是为什么所有方法都将在BigDecimal上运行返回一个新的BigDecimal作为结果
e.g。
pi = pi.add(numitor1);
第二个问题是你在计算中使用了一个double,从而击败了使用BigDecimal的全部内容。
第一次迭代后表达式pi.scale()
应该是〜53,并且ti的写入方式不会高很多。 scale只会告诉你点之后有多少小数位,而不是解决方案的准确性。
如果在一个循环中计算两个表达式,性能会更好。
你遇到的最后一个问题是,每个数字需要花费10倍的时间来计算,计算mroe比15位数(超过双倍的精度),这需要数年才能完成。