2011-10-05 60 views
2

我想知道爲什麼與下面的代碼不一致。我期望得到相同的輸出,但是當使用內聯條件語句時,它會向該字符串附加一個.0。 我的代碼中有一些錯誤嗎?使用內聯條件語句格式化小數

double d = 10.1; 

    String rounded = (false ? d : Math.round(d)) + ""; 
    System.out.println(rounded);//10.0 

    rounded = Math.round(d) + ""; 
    System.out.println(rounded);//10 

回答

4

Math.round返回long,因此條件運算符的兩個操作數不具有相同的類型,並因此更復雜的規則之後,以確定總體操作的類型,如在JLS §15.25定義:

否則,對操作數 類型應用二進制數字提升(第5.6.2節),並且條件表達式的類型是第二個和第三個操作數的提升類型 。請注意,二進制數字提升 執行拆箱轉換(第5.1.8節)和值集轉換 (第5.1.13節)。

而且從5.6.2,二進制數值提升:

如果操作數的類型是雙,其他被轉換爲加倍。


,並說明該缺陷與條件運算符和一些有趣的,從Java puzzlers(拼圖8):

char x = 'X'; 
int i = 0; 
System.out.print(true ? x : 0); // prints X 
System.out.print(false ? i : x); // prints 88 => (int)X 

此外,檢查出的HamletElvis例子(視頻鏈接) 。

+0

爲JLS鏈接投票。謝謝! – bradvido

+0

同上1+的鏈接和非常明確的答案。 –

+0

不錯的視頻鏈接..謝謝 – bradvido

2

從三元運算符返回的類型可能會被提升,以便兩個潛在的返回類型匹配。這稱爲二進制數字提升,並且在轉換爲字符串之前將您的變量從long提升爲double。

如果你有這兩個地方的潛在回報類型爲int或長:

double d = 10.1;  
String rounded = (false ? 0 : Math.round(d)) + ""; 

會發生什麼(不是一個反問句,因爲我沒有在那裏一個Java編譯器附近)?

+0

謝謝,我沒有意識到這種類型可以被提升,但這解釋了這種行爲。我想我會用傳統的if/else代替。是的,如果他們都是int/long,它不會添加任何小數。 – bradvido