java 2不同的公式问题

时间:2014-12-11 15:34:48

标签: java

我想使用Java程序计算球体的体积。所以,我用了

double result = 4/3*Math.PI*Math.pow(r,3);

这个公式似乎给出了错误的答案。

与Java program opt 4/3类似,但如果我将其更改为

double result= Math.PI*Math.pow(r,3)*4/3;
它给了我正确的答案。有人知道发生了什么吗?

3 个答案:

答案 0 :(得分:5)

这与在Java中发生转换的顺序(或C)有关。

有关运算符优先级的完整详细信息,请参阅http://introcs.cs.princeton.edu/java/11precedence/

在第一种情况下,由于乘法和除法运算符是从左到右计算的,因此java解释的第一个操作是4/3。由于两个操作数都是整数,因此java计算整数除法,结果为1。

在第二种情况下,第一个操作是双倍乘法:(Math.PI Math.pow(r,3))。第二个操作将double(Math.PI Math.pow(r,3))乘以整数(4)。这是通过将4转换为double并执行双倍乘法来执行的。最后,java必须将double(Math.PI * Math.pow(r,3)* 4)除以整数(3),在将3转换为double之后,java将其作为双除法执行。这样可以获得您期望的结果。

如果你想纠正你的第一个答案,先将3加成双:

 4/ (double)3 

你会得到你期望的结果。

答案 1 :(得分:3)

结果的差异是由于运营商的优先级。在Java中,乘法和除法具有相同的优先级,因此从左到右进行求值。

所以,你的第一个例子相当于

double result = (4/3)*Math.PI*Math.pow(r,3);

这里,4/3是两个整数的除法,在Java中,在这种情况下执行整数除法,结果为1.要解决这个问题,你必须明确确保一个或两个操作数是一个双:

double result = (4.0/3.0)*Math.PI*Math.pow(r,3);

然而,你的第二个例子相当于

double result = (Math.PI*Math.pow(r,3)*4)/3;

这里,Math.PI*Math.pow(r,3)*4部分被评估为double,因此我们不再有整数除法,你得到了正确的结果。

答案 2 :(得分:2)

4/3是两个int之间的一个分区,因此Java假定结果也是int(在这种情况下,这会产生值1)。将其更改为4.0/3.0,您就可以了,因为4.03.0被Java解释为double

double result = 4.0 / 3.0 * Math.PI * Math.pow(r,3);