Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ember.js/4.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 为什么我的代码对大数字给出了不正确的结果?_Java - Fatal编程技术网

Java 为什么我的代码对大数字给出了不正确的结果?

Java 为什么我的代码对大数字给出了不正确的结果?,java,Java,我正在尝试解决此任务: 在本练习中,您将编写一个程序来估计π的值。假装我们在看上图中的飞镖。如果正方形宽2个单位,高2个单位,则正方形内圆的半径为1个单位。那么圆的面积是π*r2=π*12=π。正方形的面积为2*2=4 π的估计将通过在镖靶上随机“投掷飞镖”来实现。我们假设每一个飞镖都会击中棋盘,但是撞击的位置是随机的,所以有些飞镖会落在圆圈内,有些飞镖会落在圆圈外。π的计算是落在圆内的省道数与省道总数的比率乘以4。请注意,随着我们增加模拟中使用的省道数量,精确度会提高 按照以下步骤完成程序:

我正在尝试解决此任务:

在本练习中,您将编写一个程序来估计π的值。假装我们在看上图中的飞镖。如果正方形宽2个单位,高2个单位,则正方形内圆的半径为1个单位。那么圆的面积是π*r2=π*12=π。正方形的面积为2*2=4

π的估计将通过在镖靶上随机“投掷飞镖”来实现。我们假设每一个飞镖都会击中棋盘,但是撞击的位置是随机的,所以有些飞镖会落在圆圈内,有些飞镖会落在圆圈外。π的计算是落在圆内的省道数与省道总数的比率乘以4。请注意,随着我们增加模拟中使用的省道数量,精确度会提高

按照以下步骤完成程序:

  • 声明变量,这些变量表示省道的x、y坐标、省道到原点的距离、落在圆内的省道数以及省道总数

  • 从用户处读入省道总数(N),并创建Random类的实例

  • 创建一个运行N次的循环。在循环中,您将使用Random类的nextFloat()方法随机创建x、y坐标,然后计算省道与原点的距离。确定省道是落在圆内还是落在圆外

  • 使用估计算法计算π

  • 以从100到100000000的递增数字运行程序,并观察π的精度

  • 这是我写的程序。它在某种程度上起作用,但对于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)));
    
        }
    
    }
    
    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
    不会更改任何内容。这是我的第一篇文章。抱歉,伙计们。感谢所有帮助!我的代码现在运行良好。感谢编辑此文章。