我想使用Java程序计算球体的体积.所以,我用过
double result = 4/3*Math.PI*Math.pow(r,3);
Run Code Online (Sandbox Code Playgroud)
这个公式似乎给出了错误的答案.
像Java程序opt 4/3,但如果我改成它
double result= Math.PI*Math.pow(r,3)*4/3;
Run Code Online (Sandbox Code Playgroud)
它给了我正确的答案.有人知道发生了什么吗?
这与在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
Run Code Online (Sandbox Code Playgroud)
你会得到你期望的结果.
结果的差异是由于运算符优先级造成的。在 Java 中,乘法和除法具有相同的优先级,因此从左到右进行计算。
所以,你的第一个例子相当于
double result = (4/3)*Math.PI*Math.pow(r,3);
Run Code Online (Sandbox Code Playgroud)
这里,4/3 是两个整数的除法,在 Java 中,在这种情况下执行整数除法,结果为 1。要解决这个问题,您必须明确确保其中一个或两个操作数是双精度数:
double result = (4.0/3.0)*Math.PI*Math.pow(r,3);
Run Code Online (Sandbox Code Playgroud)
然而,你的第二个例子相当于
double result = (Math.PI*Math.pow(r,3)*4)/3;
Run Code Online (Sandbox Code Playgroud)
在这里,该Math.PI*Math.pow(r,3)*4部分被评估为双精度,因此我们不再有整数除法,您会得到正确的结果。