Java 不确定程序为什么返回int

Java 不确定程序为什么返回int,java,Java,好的,基本问题在这里 double test = 1/3 * 3.14; 我意识到您需要执行(1.0/3)以获得实际的双倍数字。但我想知道的是为什么。我会认为,既然你乘以3.14,这将使它变成一个双倍 所以我的想法是正确的,无论在算术方程中使用两个值,不管它们周围发生了什么,如果它们是整数,那么你就会得到一个整数值 即x/y*z 当x除以y时,这就是程序所关心的,如果它们都是整数,你会得到一个整数值吗?只有当你把它乘以z(3.14),它才会变成一个双精度的 当两个运算符的优先级相等时,计算从左

好的,基本问题在这里

double test = 1/3 * 3.14;
我意识到您需要执行(1.0/3)以获得实际的双倍数字。但我想知道的是为什么。我会认为,既然你乘以3.14,这将使它变成一个双倍

所以我的想法是正确的,无论在算术方程中使用两个值,不管它们周围发生了什么,如果它们是整数,那么你就会得到一个整数值

即x/y*z


当x除以y时,这就是程序所关心的,如果它们都是整数,你会得到一个整数值吗?只有当你把它乘以z(3.14),它才会变成一个双精度的

当两个运算符的优先级相等时,计算从左到右进行<代码>*和
/
具有同等的优先级

1/3*3.14
首先计算
1/3
。两个操作数都是
int
,第一个操作是整数除法,结果是
int


接下来,评估结果*3.14。一个操作数是
int
,另一个操作数是
double
,我们有混合类型。Java帮了我们一个忙,将
int
转换为
double
,以保持准确性。浮点除法发生,结果是一个

,因为根据算术规则,首先计算1/3。因为它是2个整数,所以是整数除法,结果是0。之后,您进行了双重计算,但错误已经发生。

对于优先级相等的运算符,关联性将接管,这意味着操作顺序从左到右


因此,
1/3
首先发生,整数除法发生在
3.14
有机会将它们提升到
双精度之前。

我的理解是,这与java中的自动装箱有关。Java假设1/3将两个整数分开,这样就可以得到一个整数(转换成一个双精度整数)


如果你做1/3D,你会得到0.33333333回来

好吧,这就是我的想法,但需要澄清一下以确保。只是吹毛求疵:
3.14
是一个
double
文字,而不是
float
文字。@rgetman哈哈,新的人会让我明白的。在确认你是对的后更正。为什么这是被否决的?我认为这是一个关于操作优先级的有效问题……您所描述的内容虽然正确,但并不正确。谢谢,我把它和:)