是否有任何原始类型可以在小数点后包含多个数字?

时间:2014-01-22 08:45:23

标签: java

在程序中,我需要显示近似的PI值,接近3.141592653。 该计划来自Java的艺术与科学第6章练习3.

让我概述一下练习。想象一下,在一个长度 2r 的正方形内有一个半径 r 的圆。如果以随机的方式投掷飞镖,飞镖落入圆圈的概率是圆的面积与正方形之间的比率,即PI * r ^ 2/4 * r ^ 2,这是与PI / 4相同。因此,实验越多,PI的值就越精确。现在想象一下我们是在坐标中做到的。在-1和1之间随机选择2个数字, x y 。如果x ^ 2 + y ^ 2< 1,坐标点将落入圆中,其中1个半径位于坐标中间的中心位置。

以下是该计划:

import acm.program.*;

import acm.util.*;

public class ApproxPIValue extends ConsoleProgram{

public void run() {
    int total = 0; //calculating the time the dart falls into the circle.
    for (int a = 0; a < 10000; a++) {
        double x = rgen.nextDouble(-1.0, 1.0);
        double y = rgen.nextDouble(-1.0, 1.0);
        if ((Math.pow(x, 2) + Math.pow(y, 2)) < 1) {
            total++;
        }
    }
    println((double) (total / 10000)*4); // as I mentioned above, the result would be the approximate value of PI/4. By multiplying the result with 4, get the approximate PI value.//
}


/* set RandomGenerator as an instance variable. */
private RandomGenerator rgen = new RandomGenerator();
}

另一个问题是,无论如何打印String而不扩展任何类。正如您在代码中注意到的那样,我扩展了ConsoleProgram,它包含 println 方法。我知道有另一个名为 System.out.print 的方法,但是当我使用它时,它不起作用,即使Eclipse没有给出任何警告。

3 个答案:

答案 0 :(得分:2)

  1. 对于标题中的问题:a double精确到15位有效数字,无论小数点在哪里。
  2. 在此代码中

    (double) (total / 10000)*4)
    

    您将整数操作的结果转换为double。结果有15位有效数字,但它代表的数字是整数。一种纠正方法是

    (total / 10_000.0) * 4
    

    (无需明确转换为double

  3. 使用System.out.println()立即在屏幕上看到结果。 PrintStream引用的System.out缓冲流,这意味着它不会在写入时将每个字符传播到屏幕。当缓冲区已满或看到换行符时,它将刷新。这就是System.out.print()不会自动刷新的原因。

答案 1 :(得分:0)

由于total是一个int,total/10000使用整数除法,即它舍入为零。你似乎试图通过强制转换来使用浮点除法加倍,但实际除法在转换完成之前发生。将该行更改为

println(((double) total / 10000) *4); 

解决这个问题。

顺便说一句:Java的双倍有大约16位有效数字。

答案 2 :(得分:0)

重新阅读你的问题,我怀疑问题就在这一行:

println((double) (total / 10000)*4);

您将一个整数除以另一个整数,这将产生一个整数。然后你把它投射到double,但到那时损坏就完成了。

要解决此问题,请强制编译器将10000值视为double。这将确保结果为double

println((total / 10000d)*4);