Зачем вам нужно указывать суффикс f
в потоковом литерале?
Java: зачем вам нужно указывать 'f' в потоковом литерале?
Ответ 1
Потому что в противном случае он по умолчанию имеет значение double
, который является более часто используемым типом с плавающей запятой, чем float
.
Из Спецификация языка Java, раздел 3.10.2:
Литерал с плавающей запятой имеет тип float, если он суффикс с буквой ASCII F или f; в противном случае его тип двойной, и он может быть дополнительно суффикс с буквой ASCII D или d (§4.2.3).
(Лично я предпочел бы, чтобы не было дефолта, чтобы было ясно, во всех случаях, но это другое дело.)
Ответ 2
Поскольку нереализованные литералы с плавающей запятой удваиваются, а округление означает, что даже маленькие литералы могут принимать разные значения при округлении до плавания и двойного. Это можно наблюдать в следующем примере:
float f = (float) 0.67;
if(f == 0.67)
System.out.print("yes");
else
System.out.print("no");
Это выведет no
, потому что 0.67 имеет другое значение при округлении до плавания, чем при округлении до двойного. С другой стороны:
float f = (float) 0.67;
if(f == 0.67f)
System.out.print("yes");
else
System.out.print("no");
& hellip; выходы yes
.
ИЗМЕНИТЬ
Второй пример:
if(0.67 == 0.67f)
System.out.print("Equal");
else
System.out.print("Not Equal");
Ответ 3
Существует два типа с плавающей запятой, которые могут быть представлены, например. 100.0
. По умолчанию может быть только один. Из-за своей ограниченной точности float является чрезвычайно специализированным типом. Обычный случай - двойной, поэтому он является соответствующим по умолчанию.
В современных процессорах float и double имеют аналогичную вычислительную производительность. Единственный случай использования float - большие массивы в критически важных ситуациях, требующих ограниченной точности. Использование float удваивает количество значений с плавающей запятой, которые соответствуют одной строке кеша. Даже тогда, выясняя, является ли float достаточной точностью для данного вычисления, редко бывает тривиальным.