2011-10-05 55 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