【问题标题】:Java Ternary operator outputs different result than if else statementJava 三元运算符输出与 if else 语句不同的结果
【发布时间】:2020-03-02 14:20:10
【问题描述】:

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

【问题讨论】:

    标签: java if-statement conditional-operator


    【解决方案1】:

    在您的 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);
    

    【讨论】:

      【解决方案2】:

      这种行为完全没有问题,是由类型解析引起的。

      三元运算符本身有一个类型,由可能的结果推断出来。 由于一个结果的类型为 (int),而另一个结果的类型为 (double),因此三元运算符的类型始终为 double。

      故事的其余部分应该很清楚。将双精度打印到控制台将始终导致小数点表示。

      【讨论】:

        猜你喜欢
        • 2017-11-19
        • 2017-11-04
        • 1970-01-01
        • 2021-07-09
        • 1970-01-01
        • 1970-01-01
        • 2021-12-08
        • 2023-01-13
        • 2011-05-10
        相关资源
        最近更新 更多