gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 06:20:14 26 4
gpt4 key购买 nike

我必须使用计算 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);

最佳答案

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

例如

 pi = pi.add(numitor1);

第二个问题是您在计算中使用了 double,破坏了使用 BigDecimal 的全部意义。

表达式 pi.scale() 在第一次迭代后应该是 ~53,并且不会像 ti 的写法那样高很多。 scale 仅告诉您点后有多少位小数,而不是解决方案的准确性。

如果您在单个循环中计算两个表达式,您将获得更好的性能。

您遇到的最后一个问题是,每个数字的计算时间要长 10 倍,计算 mroe 比 15 位数字(超过 double 可以获得的精度)需要数年才能完成。

关于java - 使用 BigDecimal 在 Java 中计算 PI 时出错,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22119845/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com