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除算」を読んでください:

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 型の変数にする必要があります。int を 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 に答える