Java преобразование по нисходящей - PullRequest
1 голос
/ 13 февраля 2020

Почему char c = 65 работает и не выдает ошибку, но float d = 65.0 не работает и выдает Stati c Ошибка: неверные типы в присваивании: от double до float? Разве они не удручены?

Ответы [ 3 ]

2 голосов
/ 13 февраля 2020

I мог бы просто процитировать что-то из JLS раздела 5.2 и сказать: «Это работает так, потому что язык spe c так говорит», но это не удовлетворяло бы это?

Мое образованное предположение о том, почему спроектирован такой язык:

При преобразовании 65 в char то, что вы действительно делаете, просто удаление группы незначительных 0 в двоичном представлении, поскольку char является 16-разрядным, тогда как int является 32-разрядным. Это похоже на поворот от 0065 до 65.

С другой стороны, 65.0 - это double и представлено в формате с плавающей запятой . Обратите внимание, что, как правило, это представление является лишь приближением к истинному значению. Смотрите этот пост для получения дополнительной информации. Чем больше бит, тем лучше приближение. Таким образом, преобразование из double (64 бита) в float (32 бита) похоже на преобразование 0,333333 в 0,333. Надеюсь, вы согласитесь, что это большая потеря информации, чем поворот с 0065 на 65. Следовательно, это не преобразование, которое должно выполняться автоматически. Программисты должны знать, что это происходит.


В любом случае, вот соответствующая часть языка spe c для полноты:

Контексты назначения позволяют используйте одно из следующего:

...

Кроме того, если выражение является константным выражением (§15.28) типа byte, short, char, или int:

  • Может использоваться сужающее примитивное преобразование, если тип переменной - byte, short или char, а значение константного выражения представимо в типе переменной .

Таким образом, язык spe c дает специальную обработку byte, short, char и int, позволяя им сужать преобразование в контексте присваивания. Обратите внимание, что выражение должно быть:

1 голос
/ 26 марта 2020
float d = 65.0;

65.0 не является значением с плавающей запятой. Это двойное значение. При вводе значений с плавающей запятой число должно заканчиваться буквой f.

Вы видите здесь.

float d = 65.0f;

Если вы хотите дать d до 65 без необходимости писать букву f, вы может сделать следующее.

float d = (float)65.0;

Это известно как узкое литье.

0 голосов
/ 13 февраля 2020

65.0 в Java -смысле двойная, из-за .. Если вы хотите, чтобы это число было плавающим, просто добавьте f позади него.

float d = 65.0f

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...