为了账号安全,请及时绑定邮箱和手机立即绑定

使用 Java 的莱布尼兹公式

使用 Java 的莱布尼兹公式

慕丝7291255 2023-10-13 10:32:43
pi 的莱布尼茨公式是: 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;    }
查看完整描述

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;


查看完整回答
反对 回复 2023-10-13
?
慕婉清6462132

TA贡献1804条经验 获得超2个赞

问题是整数除法会产生整数,而不是浮点数或双精度数。

1 / 3是 0。

为了避免这种情况,您可以改用浮点数作为分母,而不是整数。

float denominator = 1.0f;


查看完整回答
反对 回复 2023-10-13
?
慕容森

TA贡献1853条经验 获得超18个赞

让你的所有操作数都是浮点类型。否则你的结果是一个整数。

请参阅Java 语言规范:

如果提升的类型是 float 或 double,则执行浮点运算。


另外,在大多数平台上,您可以使用double而不会造成任何性能损失,但这是另一个主题。;-)


查看完整回答
反对 回复 2023-10-13
  • 3 回答
  • 0 关注
  • 89 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信