Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/335.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中使用BigDecimal计算多达200位小数的PI数_Java_Decimal_Bigdecimal_Pi - Fatal编程技术网

在Java中使用BigDecimal计算多达200位小数的PI数

在Java中使用BigDecimal计算多达200位小数的PI数,java,decimal,bigdecimal,pi,Java,Decimal,Bigdecimal,Pi,为了估计圆周率π,我想特别使用蒙特卡罗方法,将其应用于一个1x1正方形内半径为1的圆的飞镖游戏。可以找到更多描述。我想要一个Java代码来估计多达200位的PI。我使用了BigDecimal,但它显示了49个十进制数字,其余数字为零。谢谢你的帮助 import java.util.*; import java.math.BigDecimal; public class PiFinder { // description public static void main(Stri

为了估计圆周率π,我想特别使用蒙特卡罗方法,将其应用于一个1x1正方形内半径为1的圆的飞镖游戏。可以找到更多描述。我想要一个Java代码来估计多达200位的PI。我使用了
BigDecimal
,但它显示了49个十进制数字,其余数字为零。谢谢你的帮助

import java.util.*;
import java.math.BigDecimal;

public class PiFinder {

    // description
    public static void main(String[] args) {
        Scanner iteration = new Scanner(System.in);
        System.out.print("Enter the number of iteration: ");
        int NoThrows = iteration.nextInt();
        BigDecimal PI = new BigDecimal(PIcalculation(NoThrows));
        PI = PI.setScale(200);

        // Difference of our estimated PI and the actual PI
        BigDecimal Difference = new BigDecimal(0);
        BigDecimal actualPI = new BigDecimal(Math.PI);
        System.out.println("Actual PI: " + actualPI);
        Difference = PI.subtract(actualPI);

        // Display results
        System.out.println("The Number of Throws = " + NoThrows);
        System.out.println("***************************");
        System.out.println("Estimated PI = " + PI);
        System.out.println("Difference = " + Difference);
    }

    // Deteremine a thrown dart is inside the circle
    public static boolean insideCircle(double pos_X, double pos_Y) {
        double distance = Math.sqrt((pos_X * pos_X) + (pos_Y * pos_Y));

        return (distance < 1.0);
    }


    public static double PIcalculation(int NoThrows) {
        Random randomGen = new Random(System.currentTimeMillis());
        int hits = 0;
        double PI = 0;

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

            double pos_X = (randomGen.nextDouble()) * 2 - 1.0;
            double pos_Y = (randomGen.nextDouble()) * 2 - 1.0;

            if (insideCircle(pos_X, pos_Y)) {
                hits++;
            }
        }

        double dthrows = NoThrows;

        // the formule
        PI = (4.0 * (hits / dthrows));

        return PI;
    }
}
import java.util.*;
导入java.math.BigDecimal;
公共类PiFinder{
//描述
公共静态void main(字符串[]args){
扫描仪迭代=新扫描仪(System.in);
System.out.print(“输入迭代次数:”);
int NoThrows=iteration.nextInt();
BigDecimal PI=新的BigDecimal(PicalCalculation(NoThrows));
PI=PI.设置刻度(200);
//我们估计的PI和实际PI的差异
BigDecimal差=新的BigDecimal(0);
BigDecimal actualPI=新的BigDecimal(Math.PI);
System.out.println(“实际PI:+actualPI”);
差值=PI减去(实际值PI);
//显示结果
System.out.println(“抛出次数=“+NoThrows”);
System.out.println(“*******************************”);
System.out.println(“估计PI=“+PI”);
System.out.println(“差异=”+差异);
}
//确定投掷的飞镖是否在圆圈内
公共静态布尔内圆(双位X,双位Y){
双距离=数学sqrt((pos_X*pos_X)+(pos_Y*pos_Y));
返回(距离<1.0);
}
公共静态双精度计算(int NoThrows){
Random randomGen=新随机(System.currentTimeMillis());
int hits=0;
双PI=0;

对于(inti=1;i而言,您的PiCalculation返回一个双精度值,您不能期望它具有更高的精度

如果您想更进一步,请在任何地方使用BigDecimal

但不管怎样,使用这种方法,即使抛出10^10次,也只能得到10个小数


double中的49位小数是由于double缺少精度

加上1,double在转换为BigDecimal时最多可以生成52位,但它本身最多只有16位精度。@yunandtidus:非常感谢。我会将它们全部更改为BigDecimal,并在任何情况下将输出张贴在这里。请注意200位小数,你需要运行10^200次投掷,这是不可计算的!那么你有什么建议吗?有什么简单的方法吗?虽然double有16位小数的精度,但是数学。sqrt可以将精度减半到8。你需要始终使用BigDecimal,但是,你也需要很大的耐心,因为每个数字都需要花费10个时间。例如,20数字需要一秒钟,然后30个数字需要300年,40个数字需要的时间比宇宙的年龄还要多。谢谢你的解释。