我想使用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;
它给了我正确的答案。有人知道发生了什么吗?
答案 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.0
和3.0
被Java解释为double
。
double result = 4.0 / 3.0 * Math.PI * Math.pow(r,3);