1

在这段代码中:

public class PiCalc {
    public static void main(String[] args) {
        double pi = 1.0;
        int n = 3;
        int denominator = 3;
        while (n<10) {
            if (n%2 == 0) {
                pi += 1/denominator;
            }
            else {
                pi -= 1/denominator;
            }
            n++;
            denominator += 2;
        }
        System.out.println(4*pi + "," + n + "," + denominator);
    }
}

输出为:4.0,10,17

因此,变量 n 和分母正在按我的意愿更新,但 pi 不是。谁能告诉我为什么?

4

3 回答 3

3

阅读“int division”,因为这就是你正在做的事情:

1 / (some int bigger than 1) returns 0

int 除以 int 的语句必须返回一个 int,因此它总是向 0 舍入。

将其更改为

1.0 / denominator

或者

(double) 1 / denominator

这样您就可以进行双重除法。

于 2013-06-02T04:25:59.603 回答
2

出于最佳实践的考虑,您不应该denominator不断地从 int 转换为 double ——您只是将它用作 double,所以它应该是一个 double 类型的变量。将整数转换为双打(或返回)不是免费的。制作denominator成双精度会更快容易理解:

public class PiCalc {
    public static void main(String[] args) {
        double pi = 1.0;
        double denominator = 3.0;
        int n = 3;
        while (n<10) {
            if (n%2 == 0) {
                pi += 1.0/denominator;
            }
            else {
                pi -= 1.0/denominator;
            }
            n++;
            denominator += 2.0;
        }
        System.out.println(4*pi + "," + n + "," + denominator);
    }
}

就此而言,如果您要使循环运行多个周期(以获得真正准确的 pi),则可以通过放弃以下内容来进一步提高性能if

public class PiCalc {
    public static void main(String[] args) {
        double pi = 1.0;
        double denominator = 3.0;
        int n = 3;
        while (n<10000) /* get a really accurate PI */ {
            pi -= 1.0/denominator;
            n++;
            denominator += 2.0;

            pi += 1.0/denominator;
            n++;
            denominator += 2.0;
        }
        System.out.println(4*pi + "," + n + "," + denominator);
    }
}
于 2013-06-02T05:02:35.533 回答
1

1/denominator总是会等同于,0因为两者都是类型int- 就像其他人提到的阅读 int 除法一样。您可能希望将两者都转换为 double 以匹配您的pi变量。因此,我会将 if 块更改为类似的内容。

if (n%2 == 0) {
    pi += 1d/(double)denominator;
} else {
    pi -= 1d/(double)denominator;
}
于 2013-06-02T04:35:59.630 回答