Java2不同的公式问题

Java2不同的公式问题,java,Java,我想用Java程序计算球体的体积。所以,我用 double result = 4/3*Math.PI*Math.pow(r,3); 这个公式似乎给出了错误的答案 就像Java程序opt 4/3,但如果我将其更改为 double result= Math.PI*Math.pow(r,3)*4/3; 它给了我正确的答案。有人知道发生了什么吗?这与Java(或C)中的转换顺序有关 有关运算符优先级的完整详细信息,请参阅 在第一种情况下,由于乘法和除法运算符是从左到右计算的,所以java解释的第一个

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

double result = 4/3*Math.PI*Math.pow(r,3);
这个公式似乎给出了错误的答案

就像Java程序opt 4/3,但如果我将其更改为

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

它给了我正确的答案。有人知道发生了什么吗?

这与Java(或C)中的转换顺序有关

有关运算符优先级的完整详细信息,请参阅

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

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

如果你想更正你的第一个答案,请先投3到加倍:

 4/ (double)3 

您将得到预期的结果。

4/3
是两个
int
之间的除法,因此Java假定结果也是
int
(在本例中,这将产生值
1
)。将其更改为
4.0/3.0
,您就没事了,因为Java将
4.0
3.0
解释为
double

double result = 4.0 / 3.0 * Math.PI * Math.pow(r,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
部分被计算为一个双精度部分,因此我们不再有整数除法,您将得到正确的结果。

1。格式,2。整数除法(4/3)和3。java中的操作顺序。确保这三件事都检查过了。我刚刚修改了你的格式和大部分的措辞。下一次,请花点时间让你的问题变得形象易懂。必要时使用标点符号和大写字符,并使用代码标记,以便正确突出显示。使用
(double)3
而不是
3.0
是否有优势?从编程的角度来看,我所知道的都没有。但我倾向于使用显式(双)转换符号,因为在以后更改常量值时,我不止一次因为忘记了“.”而被烧坏。例如,我最初有一段代码,类似于double x=3.14/2;后来我需要把公式改成,比如说,双x=3.0/2;但我可能会无意中写出双x=3/2;尤其是长配方。如果(双精度)存在,则无论值是多少,它都将保持在那里以强制执行强制转换。这是我喜欢的一种保护措施。我通常使用
,所以我会首先使用
x=3.14/2.0
。我认为它比显式地投射更具可读性。作为折衷方案:编写
3d
。这比
3.0
(double)3
中的任何一个都要短,并且仍然和施法一样明确(但没有施法)。是的,如果你小心且清醒,使用“d”或“.”对于任何你知道应该在手术前施法为双精度的数字都是完全正确的。然而,由于犯了太多的错误,我不再相信自己在一个数字上附加了任何东西(比如“d”或“a”),因为我害怕在更新该数字时无意中删除它。当我写一个(双)字时,我知道我只会故意删除它。这是一种真正反映我自身局限性的写作风格;对于那些喜欢更简洁代码的人来说,这可能是一个太多的保障。这是最详尽的答案。->+1.