pi 的莱布尼茨公式是:pi/4 = 1 - 1/3 + 1/5 - 1/7 + 1/9...输出始终为 4(这不是 pi 的值)。我将我的代码放在 java 可视化工具中,似乎问题是当代码落入 else 语句时,它不是从 pi 中减去(1-分母),而是使 prevPi 值和 pi 值相同导致 do/while 循环结束。有谁知道我该如何解决这个问题?
我的代码:
public static float piCalculatorLeibniz() {
float pi = 0;
int denominator = 1;
float prevPi = 0;
boolean keepGoing = true;
int i = 0;
while (keepGoing == true) {
prevPi = pi;
if (i % 2 == 0) {
pi += (1/denominator);
} else {
pi -= (1/denominator);
}
i++;
denominator += 2;
if (pi == prevPi) {
keepGoing = false;
}
}
pi *= 4;
return pi;
}
最佳答案
你是对的。 4其实不是Pi的值。
问题是 denominator
变量是 int
所以 1/denomenator
是 int/int
所以结果是 0
。自 pi == prevPi
只需将denominator
类型更改为double(或float),您就会得到正确的答案。
此外,您不需要编写 while(keepGoing == true)
。变量 keepGoing
已经是一个 boolean 值,你可以简单地写成 while(keepGoing)
编辑:
我喜欢玩这段代码,所以这里有一个稍微更短的版本,由于使用了 double
而更准确。它似乎也收敛得更快:
double pi = 0, denominator = 1, prevPi = 1;
while (pi != prevPi) {
prevPi = pi;
pi += (1 / denominator) - (1 / (denominator + 2));
denominator += 4;
}
return pi * 4;
关于java - 使用 Java 的莱布尼茨公式,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58329400/