Java 三元运算符输出与 if else 语句不同的结果

mmz*_*mmz 1 java if-statement conditional-operator

我正在编写一个程序,如果该数字是整数,则该程序接受一个数字并删除尾随的零。我正在使用三元运算符,但它没有按预期工作。但是如果我把它写成 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);
        }
    }

}
Run Code Online (Sandbox Code Playgroud)

例如,如果我输入 5 我得到

5.0
5
Run Code Online (Sandbox Code Playgroud)

如果我输入 7.3 我得到

7.3
7.3
Run Code Online (Sandbox Code Playgroud)

所以它似乎适用于 if else 语句但不适用于三元运算符。

Jon*_*eet 6

在您的 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);
Run Code Online (Sandbox Code Playgroud)