Java Тернарный оператор выводит результат, отличный от оператора else - PullRequest
1 голос
/ 02 марта 2020

Я пишу программу, которая принимает число и удаляет завершающие нули, если число является целым числом. Я использую троичный оператор, но он не работает, как ожидалось. Но если я напишу это как выражение 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, но не для троичного оператора.

Ответы [ 2 ]

6 голосов
/ 02 марта 2020

В вашем операторе 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);
1 голос
/ 02 марта 2020

Это поведение полностью нормально и вызвано разрешением типа.

Сам троичный оператор имеет тип, который выводится из возможных результатов. Поскольку один результат имеет тип (int), а другой - тип (double), тип троичного оператора всегда является двойным.

Остальная часть истории должна быть понятной. Вывод двойного числа на консоль всегда приводит к представлению десятичной точки.

...