2016-01-20 76 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