pi的Leibniz公式为:pi / 4 = 1-1/3 + 1/5-1/7 + 1/9 ...我试图用Java编写此代码,但遇到了一个问题输出始终为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;
}
答案 0 :(得分:4)
您是对的。 4实际上不是Pi的值。
问题在于denominator
变量是int
,因此1/denomenator
是int/int
,因此结果是0
。自pi == prevPi
只需将denominator
类型更改为双精度(或浮点型),您就会得到正确的答案。
此外,您无需编写while(keepGoing == true)
。变量keepGoing
已经是布尔值,您可以简单地写成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;
答案 1 :(得分:0)
问题在于整数除法会产生整数,而不是浮点数或双精度数。
1 / 3
为0。
为避免这种情况,可以切换为分母而不是整数。
float denominator = 1.0f;
答案 2 :(得分:-1)
使您的全部操作数为浮点类型。否则,您的结果将是整数。
请参见Java Language Specifications:
如果提升的类型为浮点型或双精度型,则将执行浮点运算。
此外,在大多数平台上,您可以使用 double 而不会造成任何性能损失,但这是另一个主题。 ;-)