3 回答
TA贡献1883条经验 获得超3个赞
你说得对。4实际上并不是Pi的值。
问题是denominator变量是int所以结果1/denomenator是。这使得您在一次迭代后退出循环,因为int/int0pi == 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;
TA贡献1804条经验 获得超2个赞
问题是整数除法会产生整数,而不是浮点数或双精度数。
1 / 3
是 0。
为了避免这种情况,您可以改用浮点数作为分母,而不是整数。
float denominator = 1.0f;
TA贡献1853条经验 获得超18个赞
让你的所有操作数都是浮点类型。否则你的结果是一个整数。
请参阅Java 语言规范:
如果提升的类型是 float 或 double,则执行浮点运算。
另外,在大多数平台上,您可以使用double而不会造成任何性能损失,但这是另一个主题。;-)
添加回答
举报