Форматирование десятичной дроби с помощью встроенного условного оператора - PullRequest
2 голосов
/ 05 октября 2011

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

Ответы [ 2 ]

4 голосов
/ 05 октября 2011

Math.round возвращает long, поэтому два операнда условного оператора не имеют одинаковый тип, и, таким образом, для определения типа всей операции используется более сложное правило, как определено в JLS §15.25 :

В противном случае двоичное числовое продвижение (§5.6.2) применяется к операнду типы, а тип условного выражения является повышенным типом второго и третьего операндов. Обратите внимание, что двоичное числовое продвижение выполняет преобразование без коробки (§5.1.8) и преобразование набора значений (§5.1.13).

А с 5.6.2, двоичное числовое продвижение:

Если один из операндов имеет тип 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 

Также ознакомьтесь с примерами Hamlet и Elvis (видео).

2 голосов
/ 05 октября 2011

Тип, возвращаемый троичным оператором, может быть повышен, так что два потенциальных возвращаемых типа совпадают.Это называется двоичным числовым продвижением, а ваша переменная повышается с длинного на двойное перед преобразованием в строку.

Если у вас было это, когда оба потенциальных типа возвращаемых значений - int или long:

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

Что происходит (не риторический вопрос, поскольку я не рядом с компилятором Java)?

...