使用Java的Leibniz公式

时间:2019-10-10 18:54:09

标签: java math pi

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

3 个答案:

答案 0 :(得分:4)

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

问题在于denominator变量是int,因此1/denomenatorint/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 而不会造成任何性能损失,但这是另一个主题。 ;-)