Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2008/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 近似Pi-为什么不';这个代码不起作用吗?_Java - Fatal编程技术网

Java 近似Pi-为什么不';这个代码不起作用吗?

Java 近似Pi-为什么不';这个代码不起作用吗?,java,Java,我用Java编写了一个快速程序,试图用整数的分数找到Pi的近似值。然而,它似乎根本没有做我想要它做的事情。事实上,它似乎什么也不做,只是重复打印硬编码的起始值 为了找出哪里出了问题,我将代码翻译成Python,因为我只是在学习Java,但对Python非常熟悉。然而,出于某种原因,它完全按照我的预期工作。我现在一定已经阅读了这两个版本的代码至少10次了,但我不明白为什么一个有效,另一个无效 总之,以下是我的Java代码: public class RationalPi { public

我用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));
        }
    }
}
公共类理性{
公共静态void main(字符串[]args){
int-arg;
如果(args.length>0){arg=Integer.parseInt(args[0]);}
else{arg=10000;}
整数=3;
int-denom=1;
双pi=数值/小数;

对于(int i=numer;i,这条线是对整数的除法,然后将(截断的)结果存储到一个double

double newPi = i / j;
如果希望得到准确的结果,请将其中一个变量强制转换为双精度

double newPi = (double) i / j;

double pi = numer / denom;

这一行是整数的除法,然后将(截断的)结果存储到一个double

double newPi = i / j;
如果希望得到准确的结果,请将其中一个变量强制转换为双精度

double newPi = (double) i / j;

double pi = numer / denom;

提示:
int/int=int
(而不是
double
)。您是在IDE中还是在命令行中运行此操作?请确保正确设置了参数,因为如果arg=0,则会给出您正在查找的结果。@Seelenvirtuose:bingo,这是OP的问题,因为Java程序在升级为双精度之前会丢弃分数。提示:
int/int=int
(而不是双重的
)。您是在IDE中运行还是在命令行中运行?请确保正确设置了参数,因为如果arg=0,则会给出您正在查找的结果。@Seelenvirtuose:bingo,这是OP的问题,因为Java程序在升级为double之前会丢弃分数。谢谢,我知道这一定是个问题y、 我现在要为自己感到羞耻了。谢谢,我知道这一定很愚蠢。我现在要为自己感到羞耻了。