Java 查找PI具有特定值的项

Java 查找PI具有特定值的项,java,Java,我在计算无穷级数的π值时有点卡住了: π=4-4/3+4/5-4/7+4/9-4/11+… 必须解决的问题是“打印一张表,显示通过计算本系列的前200000项近似得出的π值。在首次获得以3.14159开头的值之前,需要使用多少项?” 我不确定我用来寻找这个术语的条件是否正确。有人能告诉我这是对的还是错的吗?如果不是,正确的方法是什么?我怀疑这与Java如何舍入数字有关 package com.company; public class Main { public static voi

我在计算无穷级数的π值时有点卡住了:

π=4-4/3+4/5-4/7+4/9-4/11+…

必须解决的问题是“打印一张表,显示通过计算本系列的前200000项近似得出的π值。在首次获得以3.14159开头的值之前,需要使用多少项?”

我不确定我用来寻找这个术语的条件是否正确。有人能告诉我这是对的还是错的吗?如果不是,正确的方法是什么?我怀疑这与Java如何舍入数字有关

package com.company;

public class Main {

    public static void main(String[] args) {

        double result = 0;
        int j = 1;
        int k = 1; //controls the if part for finding the term
        int term = 0; //variable for term that we're looking for

        for (int i = 1; i <= 200000; i += 1) {

            if ((i % 2) != 0) {
                result += (double) 4 / j; //positive part
                j += 2;
            }
            else {
                result -= (double) 4 / j; //negative part
                j += 2;
            }

            if (k != 0) {

                /* Attempts to detect when result == 3.14159 */

                if (result > 3.14158 && result < 3.14160) { 
                    term = i;
                    k = 0;
                }
            }

            System.out.printf("%f\n", result);
        }

        System.out.println("Term at which pi has value 3.14159: " + term);
    }
}
package.com公司;
公共班机{
公共静态void main(字符串[]args){
双结果=0;
int j=1;
int k=1;//控制用于查找术语的if部分
int term=0;//我们要查找的术语的变量
对于(inti=1;i3.14158&&result<3.14160){
术语=i;
k=0;
}
}
System.out.printf(“%f\n”,结果);
}
System.out.println(“pi值为3.14159:+期限的期限”);
}
}

Java
数学
课程是你的朋友。文件如下:

我倾向于使用
Math.floor(result*100000)==314159)

您可能还希望在结果中包含
i
,以便您可以轻松地对照表格检查答案

最后,我将使用
布尔值而不是
int
进行测试。

要检查数字是否以3.14159开头,您需要检查大于或等于该值且小于3.14160的值:

if(结果>=3.14159&&result<3.14160){
..
}
通过这一更改,我得到了一个136121的
项的值,我在别处验证了这是预期的答案


不需要对结果进行任何乘法和舍入操作,因为所需的精度范围(六位小数)远低于Java
double

所提供的,我将@Alnitak的建议合并到代码中,为您提供一些其他想法,如何优化它,以及如何使用该语言的见解。我对它做了一些调整,使其重复一个数量级的次数,并产生一个小数点的精度。但是大多数语言使用的IEEE 754浮点数学遇到的限制是浮点数在内部的表示方式。许多数字实际上“不是数字”,例如无法表示。所以有四舍五入。我相信美国宇航局有办法解决这个问题:-)我不是数学家,但可能有论文讨论了实现更高精度的技术,超出了你的问题范围

public class Main {

    private final static int MAX_LOOP = 2000000;    
    private static int i = 1;

    public static void main(String[] args) {
        double j = 1.0, result = 0.0;

        for ( ; i < MAX_LOOP; i++, j += 2.0) {

            if ((i % 2) != 0) 
                result += 4.0 / j;
            else
                result -= 4.0 / j;

            if (result >= 3.141592 && result < 3.141593)
                break;

            System.out.println(result);
        }

        if (i < MAX_LOOP)
            System.out.println("Term at which pi has value 3.141592..." + result + " = " + i);
        else
            System.out.println("Couldn't find pi using series with maximum iterations = " + MAX_LOOP);
    }
}
公共类主{
私有最终静态int MAX_循环=2000000;
私有静态int i=1;
公共静态void main(字符串[]args){
双j=1.0,结果=0.0;
对于(;i=3.141592&&result<3.141593)
打破
系统输出打印项次(结果);
}
如果(i
欢迎来到StackOverflow。首先,请允许我恭维您提出了一个非常清晰和集中的问题,并发布了格式整洁的代码,以告知可能会出现的任何答案。我怀疑这与浮点数的内部存储方式有关,但我将对此进行研究。顺便说一句:你知道C吗?如果知道的话,你有没有尝试过将它尽可能直接移植到C语言,看看是否得到类似的结果?@clearlight它与浮点存储无关-只是OP尝试的范围测试不正确。@clearlight谢谢。我不知道C,但正如Alnitak所说,范围不正确。谢谢你们两位的回答:)
Math.floor(result*100000)==3.14159
永远不可能是真的。噢!现在修复这是过于复杂的IMHO-将OP代码中的第一个表达式从
result>3.14158
简单地更改为
result>=3.14159
修复了他们的问题。我明白了。谢谢你的帮助:)哇,非常感谢你的回答,我希望研究这一切对你也有好处:)。我会做一些关于数字表示的研究。我很高兴我问了这个问题,因为你的回答,我发现除了语法之外,还有很多东西需要学习,才能真正擅长编程,这让事情变得更加有趣和令人振奋。再一次谢谢你们:)是的,我喜欢传递交易技巧。没多久。谢谢你的好态度。:),我希望以后我也能传授一些技巧。不客气:)
public class Main {

    private final static int MAX_LOOP = 2000000;    
    private static int i = 1;

    public static void main(String[] args) {
        double j = 1.0, result = 0.0;

        for ( ; i < MAX_LOOP; i++, j += 2.0) {

            if ((i % 2) != 0) 
                result += 4.0 / j;
            else
                result -= 4.0 / j;

            if (result >= 3.141592 && result < 3.141593)
                break;

            System.out.println(result);
        }

        if (i < MAX_LOOP)
            System.out.println("Term at which pi has value 3.141592..." + result + " = " + i);
        else
            System.out.println("Couldn't find pi using series with maximum iterations = " + MAX_LOOP);
    }
}