猿问

使用 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;

    }


慕丝7291255
浏览 90回答 3
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;

慕婉清6462132

问题是整数除法会产生整数,而不是浮点数或双精度数。1 / 3是 0。为了避免这种情况,您可以改用浮点数作为分母,而不是整数。float denominator = 1.0f;

慕容森

让你的所有操作数都是浮点类型。否则你的结果是一个整数。请参阅Java 语言规范:如果提升的类型是 float 或 double,则执行浮点运算。另外,在大多数平台上,您可以使用double而不会造成任何性能损失,但这是另一个主题。;-)
随时随地看视频慕课网APP

相关分类

Java
我要回答