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



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

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

所定义的:

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

从5.6.2开始,二进制数字提升:

如果其中一个操作数为double类型,另一个操作数转换为double类型。


为了说明条件运算符的缺陷,为了好玩,请参考Java难题(难题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 

还有,看看哈姆雷特和猫王的例子(视频链接)。

可以提升三元操作符返回的类型,使两种可能的返回类型匹配。这称为二进制数字提升,在转换为String之前,您的变量将从long提升为double。

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

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

发生了什么(不是一个反问,因为我没有在Java编译器附近)?

最新更新