我正在尝试解决此任务:
在本练习中,您将编写一个估计π值的程序。假设我们正在看上面图片中的飞镖。如果正方形的宽度为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;
到
int
或long
。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
的数字,这会导致数字较大的问题。