Дробные литералы представляют собой числа с плавающей десятичной точкой. Правила записи таких чисел такие же, как и в большинстве современных языков программирования.
Примеры:
3.14
2.
.5
7е10
3.1Е-20
Таким образом, дробный литерал состоит из следующих составных частей:
• целая часть;
• десятичная точка (используется А8СП-символ точка);
• дробная часть;
• показатель степени (состоит из латинской ASCII-буквы Е в произвольном регистре и целого числа с опциональным знаком + или -);
• окончание-указатель типа.
Целая и дробная части записываются десятичными цифрами, а указатель типа (аналог указателя L или I для целочисленных литералов типа 'опд)имеет два возможных значения - латинскаяASCII-буква D (для типа double) или F (для типа float) в произвольном регистре. Они будут поровну рассмотрены ниже.
Необходимыми частями являются:
• хотя бы одна цифра в целой или дробной "части;
• десятичная точка или показатель степени, или указатель типа.
Все остальные части необязательные. Таким образом, "минимальные" дробные литералы могут быть записаны, например, так:
1. .1 1е1
1f
В Java есть два дробных типа, упомянутые выше, - float и double. Их длина - 4 и 8 байт или 32 и 64 бита, соответственно. Дробный литерал имеет тип float, если он заканчивается на латинскую букву F в произвольном регистре. В противном случае он рассматривается как значение типа double и может включать в себя окончание D или d, как признак типа double(используется только для наглядности).
В Java дробные числа 32-битного типа float и 64-битного типа double хранятся в памяти в бинарном виде в формате, стандартизированном спецификацией ШЕЕ 754 (полное название — IEEE Standard for Binary Floating-Point Arithmetic, ANSI/IEEE Standard 754-1985 (IEEE, New York)). В этой спецификации описаны не только конечные дробные величины, но и еще несколько особых значений, а именно:
• положительная и отрицательная бесконечности (positive/negative infinity);
• значение "не число", Not-a-Number, сокращенно NaN;
• положительный и отрицательный нули.
Для этих значений нет специальных обозначений. Чтобы получить такие величины, необходимо либо произвести арифметическую операцию (например, результатом деления ноль на ноль 0.0/0.0 является NaN), либо обратиться к константам в классах Float и Double, а именно POSITIVE_INFINITY, NEGATIVEJNFINITY и NaN. Более подробно работа с этими особенными значениями рассматривается в следующей лекции.
Типы данных накладывают ограничения на возможные значения литералов, как и для целочисленных типов. Максимальное положительное конечное значение дробного литерала:
• для float: 3.40282347e+38f
• для double: 1.79769313486231570е+308
• Кроме того, для дробных величин становится важным еще одно предельное значение — минимальное положительное ненулевое значение:
• для float: 1.40239846e-45f
• для double: 4.94065645841246544е-324
Попытка указать литерал со слишком большим абсолютным значением (например, 1 e40F) приведет к ошибке компиляции. Такая величина должна представляться бесконечностью. Аналогично, указание литерала со слишком малым ненулевым значением (например, 1е-350) также приводит к ошибке. Это значение должно быть округлено до нуля. Однако если округление приводит не к нулю, то компилятор произведет его сам:
// ошибка, выражение должно быть округлено до 0 O.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOIf // ошибки нет, компилятор сам округляет до 1I.OOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOOIf
Стандартных возможностей вводить дробные значения не в десятичной системе в Java нет, однако классы Float и Double предоставляют много вспомогательных методов, в том числе и для такой задачи.