2016-01-20 79 views
1

我对此很陌生,因为您可能知道,请向初学者澄清以下代码是如何缩小输出-2.50作为答案的。在整数 - >双倍的情况下,我仍然对促销/降级主题感到困惑。Java原始类型推广混淆

int x = 5; 
    double y = 2.5; 
    double q = x/10 - y; 
    System.out.printf("%.2f\n",q); 

我看到它的方式是:双Q = 5.0(X升为从int一倍)/ 10.0 - 2.5 这将是等于0.5 - 因为“%2.5 = -2.00(2位小数.2f \ n“)

为什么正确答案-2.50而不是-2.00?

+0

提示..分区比减法具有更高的优先级。分部首先发生(并且其值为0),然后从0中减去“2.5”。 – TheLostMind

+0

@TheLostMind我明白分部在减法之前出现,但为什么分区的值为0 –

+0

这在JLS中提到过。你首先将整数除以整数,然后在必要时进行转换 – TheLostMind

回答

4

X是一个整数,x/10的值将产生0而不是0.5(因为x和10都是int)。如果你做x/10.0,那么输出将是0.5。

+0

有道理,但是在那种情况下..什么时候将int推广到双精度? –

+0

如果立即操作涉及双倍。意思是x/10.0d会将x转换为double,因为10.0d是double的 –

0
double q = x/10f - y; 

x/10 // it will be thought as int 
+0

什么时候将int提升为double? –

2

你也可以写你的表达是这样的:

double q = (x/10) - y;

现在在括号内没有双打,所以这是一个纯粹的int -division,这给5/10 = 0。之后,你有

double q = 0 - y;

现在你有一个int的一个double的差异。这里是从(int)0(double)0.0的促销活动。

最终的结果将是

double q = 0.0 - 2.5; //q == -2.5

1

double q = x/10 - y; 在此,因为除法具有比减法更大优先因此x/10将执行第一和在这里我们将两个整数(不考虑这一事实的变量,其中最终答案存储为双精度型),所以答案将是一个整数,即5/10 = 0,然后减去一个int和double将完成(这里int将被提升为double)。所以有效的现在是0.0 - 2.5,因此答案是-2.50