我正在尝试解决此任务:


  在本练习中,您将编写一个估计π值的程序。假设我们正在看上面图片中的飞镖。如果正方形的宽度为2个单位,高度为2个单位,则正方形内的圆的半径为1个单位。则圆的面积为π* r2 =π* 12 =π。正方形的面积将为2 * 2 = 4。
  
  π的估计将通过在飞镖板上随机“投掷飞镖”而起作用。我们将假设每个飞镖都会击中棋盘,但是击中的位置是随机的,因此有些飞镖将落在圆圈内,而有些飞镖将落在圆圈外。然后,π的计算是落入圆内的飞镖数量与飞镖总数之比乘以4。请注意,随着我们增加模拟中使用的飞镖数量,精度会提高。
  
  请按照以下步骤完成程序:
  
  
  声明代表飞镖的x,y坐标,飞镖距原点的距离,落在圆内的飞镖数量以及飞镖总数的变量。
  从用户读取飞镖总数(N),并创建Random类的实例。
  创建一个运行N次的循环。在循环内部,您将使用Random类的nextFloat()方法随机创建x,y坐标,然后计算飞镖距原点的距离。确定飞镖是否落在圆的内部或外部。
  使用估计算法计算π。
  从100到100,000,000递增数字运行该程序,并观察π的精度。
  


这是我写的程序。它可以在某种程度上起作用,但是对于100000这样的输入,结果似乎不正确。有人可以解释我的代码有什么问题吗?

import java.util.Scanner;
import java.util.Random;

public class calculatePI {
    public static void main(String[] args) {
        double x;
        double y;
        double distance;
        int i = 0;
        float inside = 0;
        float outside = 0;
        float totalDarts;

        Scanner scan = new Scanner(System.in);
        Random random = new Random();

        System.out.println("Enter the number of darts: ");
        totalDarts = scan.nextFloat();

        for (i = 1; i < totalDarts; i++) {
            x = Math.abs(random.nextFloat() % 2);
            y = Math.abs(random.nextFloat() % 2);

            distance = (float) Math.sqrt(Math.pow(x - 1, 2)
                    + Math.pow(y - 1, 2));

            if (distance <= 1)
                inside++;
            else
                outside++;
        }

        System.out.println("Total number of arrows inside circle:" + inside);
        System.out.println("Estimated value of Pie: "
                + (((inside * 4) / (double) totalDarts)));

    }

}

最佳答案

为了解决您的问题,更改类型

float inside = 0;
float outside = 0;
float totalDarts;


intlong

float的问题在于,并非所有整数都可以用此类型精确表示。 float使用24位存储数字(其余位用于存储符号和精度),这意味着在不损失精度的情况下,float只能存储int-16777216范围内的16777216值。

您可以通过观察

System.out.println(16777216f);
System.out.println(16777217f);
System.out.println(16777218f);


哪个打印

1.6777216E7
1.6777216E7
1.6777218E7


现在您看到16777217不能精确表示,并且将用16777216表示。这意味着16777216f+1仍将返回16777216F,这将阻止您的totalDarts大于16777216的数字,这会导致数字较大的问题。

10-08 15:35