首页 > 解决方案 > 使用 Java 的莱布尼茨公式

问题描述

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;
    }

标签: javamathpi

解决方案


你是对的。4 实际上不是 Pi 的值。

问题是denominator变量是这样int,结果是。这使您在一次迭代后退出循环,因为1/denomenatorint/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;

推荐阅读