我已经尝试了几天使用系列扩展pi = 4(1-1/3+1/5-1/7...
来计算pi,但每当我使用下面的代码时,它都会返回4.0。
public class Pi {
public static void main (String args[]) {
double pie = 0.0;
int max = 1000;
for (int x = 1 ; x < max ; x = x + 2) {
if (x % 4 == 1) {
pie+= 1/x;
} else if (x % 4 == 3) {
pie-=1/x;
}
}
System.out.println(4*pie);
}
}
在此,我将pie
计算为1000以下的分母。Pie
是存储为pie
创建的值的变量。最后,它打印pi,但总是返回4.0。
使用我的IDE(Eclipse
)中的调试功能,我看到pie
的值从初始值0跳到4,但在其余时间没有改变程序在for循环中递增x
的值,它对pi没有任何作用。
答案 0 :(得分:4)
您正在使用1/x
执行整数除法,它始终会生成int
,从而截断真正的十进制值。 1/1
为1
,但1
除以Java中的0
更大值,因此您的结果将始终为4
。
使用double
字面值强制浮点除法。
pie += 1.0 / x; // and pie -= 1.0 / x;
或者,您可以将1
投射到double
。
pie += (double) 1 / x; // and pie -= (double) 1 / x;
答案 1 :(得分:1)
问题是您正在执行整数除法并将结果添加到double。 x
是int
,1
是int
。将整数除以整数时,将返回一个整数。因此,您添加到pie
的内容始终是整数。
第一次运行循环时,计算表达式1/1
,它只返回1
(整数)并将该值赋给pie
。对于之后的所有其他内容,您获得0
,这意味着pie
不会发生变化。因此,当您最终打印4 * pie
时,您会获得4
。
有几个选择:
double
。pie += 1 / x;
更改为pie += (1.0 / x);
(另一个更改相同)1
投放到double
,然后再添加到pie
:pie += (double) 1 / x
。答案 2 :(得分:0)
问题是你正在进行一个小于零的整数除法。作为整数,该值将舍入为零。这会在每次迭代时为馅饼增加零。
你需要做的是将文字整数替换为文字浮点数,像这样
package cl.misc.pi;
public class Pi {
public static void main(String args[]) {
double pie = 0.0;
int max = 1000;
for (int x = 1; x < max; x = x + 2) {
if (x % 4 == 1) {
pie += 1.00 / x;
} else if (x % 4 == 3) {
pie -= 1.00 / x;
}
}
System.out.println(4 * pie);
}
}
如您所见,我确实将pie += 1 / x
替换为pie += 1.00 / x
,现在将一个浮点结果添加到饼中。
此例程的结果为3.139592655589785