使用内联条件语句格式化十进制

时间:2011-10-05 13:37:52

标签: java math formatting rounding

我想知道为什么与下面的代码不一致。我期望相同的输出,但是当使用内联条件语句时,它会向字符串附加.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

2 个答案:

答案 0 :(得分:4)

Math.round返回long,因此条件运算符的两个操作数不具有相同的类型,因此遵循更复杂的规则来确定整体操作的类型,如定义的那样在JLS §15.25中:

  

否则,二进制数字提升(第5.6.2节)将应用于操作数   类型,条件表达式的类型是提升类型   第二和第三个操作数。注意二进制数字促销   执行拆箱转换(第5.1.8节)和值集转换   (§5.1.13)。

从5.6.2开始,二进制数字促销:

  

如果任一操作数的类型为double,则另一个操作数转换为double。


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示例(视频链接)。

答案 1 :(得分:2)

可以提升从三元运算符返回的类型,以便两个潜在的返回类型匹配。这称为二进制数字提升,在转换为String之前,您的变量将从long提升为double。

如果你有两个潜在的返回类型是int或long:

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

会发生什么(不是修辞问题,因为我不在Java编译器附近)?