Java 为什么我的代码对大数字给出了不正确的结果?
我正在尝试解决此任务: 在本练习中,您将编写一个程序来估计π的值。假装我们在看上图中的飞镖。如果正方形宽2个单位,高2个单位,则正方形内圆的半径为1个单位。那么圆的面积是π*r2=π*12=π。正方形的面积为2*2=4 π的估计将通过在镖靶上随机“投掷飞镖”来实现。我们假设每一个飞镖都会击中棋盘,但是撞击的位置是随机的,所以有些飞镖会落在圆圈内,有些飞镖会落在圆圈外。π的计算是落在圆内的省道数与省道总数的比率乘以4。请注意,随着我们增加模拟中使用的省道数量,精确度会提高 按照以下步骤完成程序:Java 为什么我的代码对大数字给出了不正确的结果?,java,Java,我正在尝试解决此任务: 在本练习中,您将编写一个程序来估计π的值。假装我们在看上图中的飞镖。如果正方形宽2个单位,高2个单位,则正方形内圆的半径为1个单位。那么圆的面积是π*r2=π*12=π。正方形的面积为2*2=4 π的估计将通过在镖靶上随机“投掷飞镖”来实现。我们假设每一个飞镖都会击中棋盘,但是撞击的位置是随机的,所以有些飞镖会落在圆圈内,有些飞镖会落在圆圈外。π的计算是落在圆内的省道数与省道总数的比率乘以4。请注意,随着我们增加模拟中使用的省道数量,精确度会提高 按照以下步骤完成程序:
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)));
}
}
import java.util.Scanner;
导入java.util.Random;
公共类计算器{
公共静态void main(字符串[]args){
双x;
双y;
双倍距离;
int i=0;
内部浮动=0;
外部浮动=0;
飞镖;
扫描仪扫描=新扫描仪(System.in);
随机=新随机();
System.out.println(“输入省道数:”);
totalDarts=scan.nextFloat();
对于(i=1;i 如果(距离要解决您的问题,请更改
float inside = 0;
float outside = 0;
float totalDarts;
到int
或long
float
的问题在于并非所有整数都可以用这种类型精确表示。float
使用24位存储数字(其余位用于存储符号和精度)这意味着在不损失精度的情况下,float
只能在-16777216
到16777216
的范围内存储int
值
你可以用肉眼观察
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
,从而导致更大的数字出现问题。okay好的,我得到了期望的结果,但仅针对特定的省道输入。程序正在运行,但当我将值设置为接近100000时,我不知道为什么。我只需要了解如何执行INTERGER overflow。输入的int大于INTERGER.MAX_值,恰好是2147483647或0x7fffffff,略高于20亿。它是doesn没有关系,因为for循环使用int,所以你的循环溢出了。对我的第一个评论,我很抱歉。收回,对你的问题加1+。对于for循环,我会使用longs。永远不要使用浮点数作为循环索引。不是说它解决了任何问题,而是说你想用random.nextFloat()实现什么%2
?nextFloat
将永远不会返回大于1的值(它返回的值范围为0.0[包含]-1.0[独占]),因此%2
不会更改任何内容。这是我的第一篇文章。抱歉,伙计们。感谢所有帮助!我的代码现在运行良好。感谢编辑此文章。