Java 三元运算符输出与 if else 语句不同的结果
Java Ternary operator outputs different result than if else statement
我正在编写一个程序,它接受一个数字并在该数字是整数时删除尾随零。
我正在使用三元运算符,但它没有按预期工作。但是如果我把它写成 if else 语句它就可以了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double number = scanner.nextDouble();
System.out.println(((int)number == (double)number) ? (int)number : number); // Always outputs a double
if ((int)number == (double)number) { // Outputs correct result
System.out.println((int)number);
}
else {
System.out.println(number);
}
}
}
例如,如果我输入 5,我会得到
5.0
5
如果我输入 7.3 我得到
7.3
7.3
所以它似乎适用于 if else 语句但不适用于三元运算符。
在您的 if/else 语句中,您调用 PrintStream.println(int)
或 PrintStream.println(double)
取决于您选择的分支。
使用条件运算符 ?: 您 总是 调用 PrintStream.println(double)
,因为那是 ?:
表达式的类型。当?:
运算符的第二个和第三个操作数的类型不同时,编译器会根据JLS 15.25的规则选择表达式的整体类型,并在必要时进行适当的转换。
在这种情况下,整体类型是 double
,所以就好像你在写:
double tmp = ((int) number == (double)number) ? (int)number : number;
System.out.println(tmp);
此行为完全正常,是由类型解析引起的。
三元运算符本身有一个类型,由可能的结果推断。
由于一个结果的类型为 (int),另一个结果的类型为 (double),因此三元运算符的类型始终为 double。
故事的其余部分应该很清楚了。将 double 打印到控制台将始终导致小数点表示。
我正在编写一个程序,它接受一个数字并在该数字是整数时删除尾随零。 我正在使用三元运算符,但它没有按预期工作。但是如果我把它写成 if else 语句它就可以了。
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner scanner = new Scanner(System.in);
double number = scanner.nextDouble();
System.out.println(((int)number == (double)number) ? (int)number : number); // Always outputs a double
if ((int)number == (double)number) { // Outputs correct result
System.out.println((int)number);
}
else {
System.out.println(number);
}
}
}
例如,如果我输入 5,我会得到
5.0
5
如果我输入 7.3 我得到
7.3
7.3
所以它似乎适用于 if else 语句但不适用于三元运算符。
在您的 if/else 语句中,您调用 PrintStream.println(int)
或 PrintStream.println(double)
取决于您选择的分支。
使用条件运算符 ?: 您 总是 调用 PrintStream.println(double)
,因为那是 ?:
表达式的类型。当?:
运算符的第二个和第三个操作数的类型不同时,编译器会根据JLS 15.25的规则选择表达式的整体类型,并在必要时进行适当的转换。
在这种情况下,整体类型是 double
,所以就好像你在写:
double tmp = ((int) number == (double)number) ? (int)number : number;
System.out.println(tmp);
此行为完全正常,是由类型解析引起的。
三元运算符本身有一个类型,由可能的结果推断。 由于一个结果的类型为 (int),另一个结果的类型为 (double),因此三元运算符的类型始终为 double。
故事的其余部分应该很清楚了。将 double 打印到控制台将始终导致小数点表示。