在程序中,我需要显示近似的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没有给出任何警告。
答案 0 :(得分:2)
double
精确到15位有效数字,无论小数点在哪里。在此代码中
(double) (total / 10000)*4)
您将整数操作的结果转换为double
。结果有15位有效数字,但它代表的数字是整数。一种纠正方法是
(total / 10_000.0) * 4
(无需明确转换为double
。
使用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);