近似Pi - 为什么这段代码不起作用?

时间:2015-10-30 17:21:41

标签: java

我用Java编写了一个快速程序,尝试使用整数分数找到Pi的近似值。然而,它似乎根本没有做我想要它做什么。事实上,它似乎什么都不做,只是重复打印出硬编码的起始值。

为了弄清楚出了什么问题,我把我的代码翻译成了Python,因为我只是学习Java而且对Python很熟悉。但是,由于某种原因,它完全按照我的意图工作。我现在必须阅读这两个版本的代码至少10次,我不明白为什么一个有效,另一个没有。

无论如何,这是我在Java中的代码:

public class RationalPi {
    public static void main(String[] args) {
        int arg;
        if (args.length>0) { arg = Integer.parseInt(args[0]); }
        else { arg = 10000; }
        int numer = 3;
        int denom = 1;
        double pi = numer / denom;
        for (int i=numer; i<=arg; i++) {
            for (int j=i/4; j<=i/2; j++) {
                if (j==0) { continue; }
                double newPi = i / j;
                if (Math.abs(newPi-Math.PI) < Math.abs(pi-Math.PI)) {
                    System.out.println("found better approximation");
                    numer = i;
                    denom = j;
                    pi = newPi;
                }
            }
            System.out.println(String.format("%d /%2d == %f", numer, denom, pi));
        }
    }
}

这就是我认为应该是Python中功能相同的代码:

from math import pi as PI

def findApproximate(arg=10000):
    numer, denom = 3, 1
    pi = numer / denom
    for i in range(numer, arg+1):
        for j in range(int(i/4), int((i/2)+1)):
            if not j:
                continue
            newPi = i / j
            if abs(newPi-PI) < abs(pi-PI):
                print("Found better approximation")
                numer, denom, pi = i, j, newPi
        print("%d / %d == " % (numer, denom) + str(pi))
    return pi

但由于某种原因,这种方法很有效,而上述情况并非如此,而且它让我绝对疯狂。如果可以,请帮忙。

1 个答案:

答案 0 :(得分:4)

此行分割整数,然后将(截断的)结果存储为双精度

double newPi = i / j;
如果你想要一个准确的结果,

将其中一个变量加到双倍

double newPi = (double) i / j;

相同
double pi = numer / denom;