好的基本问题在这里。
double test = 1/3 * 3.14;
我意识到你需要做(1.0 / 3)以获得实际的双号。但我想知道的是为什么。我会想到,因为你乘以3.14,这将使它成为一个双倍。
所以我认为无论何时在算术方程中使用两个值,无论周围发生了什么,如果它们是整数,那么你会得到一个整数值吗?
即。 x / y * z
虽然x除以y,这是程序关心的全部,如果它们都是整数,你会得到一个整数值吗?只有当你将它乘以z(3.14)时它才变为双精度。
答案 0 :(得分:4)
当两个运算符具有相同的优先级时,从左到右进行评估。 *
和/
具有相同的优先权。
1 / 3 * 3.14
首先评估1 / 3
。两个操作数都是int
,第一个操作是整数除法,结果是int
。
接下来,评估result * 3.14
。一个操作数是int
,另一个操作数是double
,我们有混合类型。 Java帮我们一个忙,并将int
强制转换为double
以保持准确性。发生浮点除法,结果为double
。
答案 1 :(得分:3)
对于具有相同优先级的运算符,关联性接管。 These operators /
and *
are left-associative,这意味着操作顺序从左到右进行。
因此,1/3
首先发生,整数除法发生在3.14
有机会将其推广到double
之前。
答案 2 :(得分:2)
因为根据算术规则,首先计算1/3。由于它是2个整数,它是一个整数除法,结果为0.之后你有一个双重计算,但错误已经发生。
答案 3 :(得分:0)
我的理解是这与java中的自动装箱有关。 Java假设1/3正在划分两个整数,所以你得到一个int(转换成一个double)。
如果你做了1 / 3D,你会得到0.33333333回来