Ява: Почему мы должны разыграть число с плавающей точкой, а не двойную? - PullRequest
0 голосов
/ 29 августа 2018

Я не знаю, считаете ли вы это важным вопросом или нет, но я хочу знать. float - число с плавающей точкой (4 байта). double это число с плавающей запятой (8 байт). Почему мы определяем двойное без литья:

double d = 2.1;

Но нам нужно разыграть с плавающей точкой:

float f = (float) 2.1;

или

float f = 2.1f;

Заранее спасибо.

Ответы [ 3 ]

0 голосов
/ 29 августа 2018

Литерал с плавающей точкой имеет тип float, если он заканчивается буквой F или f; в противном случае его типом является double, и он может произвольно заканчиваться буквой D или d.

Типы с плавающей запятой (float и double) также могут быть выражены с помощью E или e (для научной записи), F или f (32-битный литерал с плавающей запятой) и D или d (64-битный двойной литерал; это значение по умолчанию и по соглашению опущено).

double d1 = 123.4;
// same value as d1, but in scientific notation
double d2 = 1.234e2;
float f1  = 123.4f;

См. Литералы с плавающей точкой в ​​oracle Java Tutorial

0 голосов
/ 29 августа 2018

По умолчанию компилятор Java воспринимает 2.1 как двойной (64 бита), а не как с плавающей точкой (32 бита). Объявление float f = 2,1 приведет к потере точности. Следовательно, Java заставляет вас выполнять приведение, чтобы убедиться, что вы объявляете переменную с плавающей точкой.

Без приведения вы можете достичь того же с помощью буквы 'f' в конце чисел с плавающей запятой. Например, float f=2.1f.

Теперь вы можете спросить, почему приведение не требуется при конвертации из long в float, потому что первый использует больше внутренних битов, чем последний. Ответ в том, что Java не нуждается в преобразовании по пути расширения - byte => short => int => long => float => double. (Слева направо (расширяющееся преобразование) - приведение не требуется; Справа налево (сужающее преобразование) - требуется явное приведение)

0 голосов
/ 29 августа 2018

Двойные значения более точны, а дополнительная стоимость хранения почти всегда незначительна. Так что в Java по умолчанию 2.1 это двойной тип. Теперь для преобразования double в float вам необходимо выполнить приведение, тогда как назначение двойных данных для преобразования типа double не требуется.

...