Класс Double
- Все реализуемые интерфейсы:
Serializable, Comparable<Double>, Constable, ConstantDesc
public final class Double extends Number implements Comparable<Double>, Constable, ConstantDesc
Double является классом-оболочкой для значений примитивного типа double. Объект типа Double содержит одно поле типа double. Кроме того, этот класс предоставляет несколько методов для преобразования double в String и String в double, а также другие константы и методы, полезные при работе с double.
Это основанный на значении класс; программистам следует считать экземпляры, которые равны, взаимозаменяемыми и не использовать экземпляры для синхронизации, иначе возможно непредсказуемое поведение. Например, в будущей версии синхронизация может завершиться неудачно.
Равенство чисел с плавающей запятой, эквивалентность и сравнение
Числа с плавающей запятой IEEE 754 включают конечные ненулевые значения, знаковые нули (+0.0 и -0.0), знаковые бесконечности (положительная бесконечность и отрицательная бесконечность) и NaN (не число). Отношение эквивалентности на множестве значений — это булево отношение на парах значений, которое рефлексивно, симметрично и транзитивно. Подробнее об отношениях эквивалентности и равенстве объектов см. в спецификации Object.equals. Отношение эквивалентности разбивает значения, над которыми оно действует, на множества, называемые классами эквивалентности. Все элементы класса эквивалентности равны друг другу в рамках этого отношения. Класс эквивалентности может содержать только один элемент. По крайней мере, для некоторых целей все элементы класса эквивалентности взаимозаменяемы. В частности, в числовом выражении эквивалентные значения можно подставлять друг вместо друга без изменения результата выражения, то есть без изменения класса эквивалентности результата выражения.
Примечательно, что встроенная операция == над числами с плавающей запятой не является отношением эквивалентности. Несмотря на то что семантика оператора IEEE 754 == не задаёт отношение эквивалентности, она была намеренно разработана с учётом других потребностей численных вычислений. Существуют два исключения, в которых свойства отношения эквивалентности не выполняются для
== над числами с плавающей запятой:
- Если
v1иv2оба являются NaN, тоv1 == v2имеет значениеfalse. Поэтому для двух аргументов NaN рефлексивное свойство отношения эквивалентности не выполняется для оператора==. - Если
v1представляет+0.0, аv2представляет-0.0, или наоборот, тоv1 == v2имеет значениеtrue, хотя+0.0и-0.0различимы при различных операциях с плавающей запятой. Например,1.0/+0.0вычисляется как положительная бесконечность, а1.0/-0.0— как отрицательная бесконечность; положительная и отрицательная бесконечности не равны друг другу и не эквивалентны друг другу. Таким образом, хотя знак входного знакового нуля чаще всего определяет знак нулевого результата, из-за деления на ноль+0.0и-0.0в общем случае нельзя подставлять друг вместо друга. Знак нулевого входного значения также оказывает невзаимозаменяемое влияние на результат некоторых методов математической библиотеки.
При упорядоченном сравнении с помощью встроенных операторов сравнения (<, <= и т. д.) значения NaN приводят к ещё одной аномалии: NaN не меньше, не больше и не равно ни одному значению, включая само себя. Это означает, что трихотомия сравнения не выполняется.
Чтобы обеспечить надлежащую семантику методов equals и compareTo, эти методы не могут быть простыми оболочками над == или операциями упорядоченного сравнения. Вместо этого equals использует эквивалентность представления, определяя аргументы NaN как равные друг другу, что восстанавливает рефлексивность, и определяя, что +0.0 не равно -0.0. Для сравнений метод compareTo задаёт полный порядок, в котором -0.0 меньше +0.0, а NaN равен самому себе и считается больше положительной бесконечности.
Операционная семантика equals и
compareTo выражается через побитовое преобразование значений с плавающей запятой в целочисленные значения.
Естественный порядок, реализованный методом compareTo, согласован с equals. То есть два объекта считаются равными методом equals тогда и только тогда, когда compareTo для этих объектов возвращает ноль.
Изменённое поведение, заданное для equals и
compareTo, позволяет экземплярам классов-оболочек корректно работать с обычными структурами данных. Например, определение значений NaN как equals друг другу позволяет использовать NaN в качестве элемента HashSet или ключа HashMap. Аналогично, определение
compareTo как полного порядка, включающего +0.0,
-0.0 и NaN, позволяет использовать экземпляры классов-оболочек в качестве элементов SortedSet или ключей SortedMap.
Сравнение числового равенства с различными полезными отношениями эквивалентности, которые можно определить для чисел с плавающей запятой:
-
числовое равенство (оператор
==): (не является отношением эквивалентности) - Два числа с плавающей запятой представляют одно и то же расширенное действительное число. Расширенные действительные числа — это действительные числа, дополненные положительной и отрицательной бесконечностями. При числовом равенстве
+0.0и-0.0равны, поскольку оба отображаются в одно и то же действительное значение — 0. NaN не отображается ни в какое действительное число и не равен ни одному значению, включая само себя. - побитовая эквивалентность:
- Биты двух чисел с плавающей запятой совпадают. Это отношение эквивалентности для значений
doubleaиbреализуется выражениемDouble.doubleToRawLongBits(a) == Double.doubleToRawLongBits(b)
В рамках этого отношения+0.0и-0.0различаются, а каждый битовый шаблон, кодирующий NaN, отличается от любого другого битового шаблона, кодирующего NaN. - эквивалентность представления:
- Два числа с плавающей запятой представляют один и тот же элемент данных IEEE 754. В частности, для конечных значений совпадают знак, показатель и значащая часть чисел с плавающей запятой. В рамках этого отношения:
-
+0.0и-0.0различаются. - каждый битовый шаблон, кодирующий NaN, считается эквивалентным любому другому
- положительная бесконечность эквивалентна положительной бесконечности; отрицательная бесконечность эквивалентна отрицательной бесконечности.
-
Double.doubleToLongBits(a) == Double.doubleToLongBits(b) -
Double.valueOf(a).equals(Double.valueOf(b)) -
Double.compare(a, b) == 0
-
a и b, если ни одно из a и b не равно нулю или NaN, то три отношения — числовое равенство, побитовая эквивалентность и эквивалентность представления — для a и b имеют одинаковое значение true/false. Иными словами, для двоичных чисел с плавающей запятой эти три отношения различаются только в том случае, если хотя бы один аргумент равен нулю или NaN. Проблемы преобразования десятичных чисел ↔ двоичные числа
Многие неожиданные результаты двоичной арифметики с плавающей запятой связаны с особенностями преобразования десятичных чисел в двоичные и двоичных чисел в десятичные. Целые числа можно точно представить в любой системе счисления, однако возможность точного представления дробных значений в системе счисления зависит от её основания. Например, в системе счисления с основанием 10 дробь 1/3 является периодической (0.33333....), а в системе с основанием 3 дробь 1/3 точно равна 0.1(3), то есть 1 × 3-1. Аналогично, в системе с основанием 10 дробь 1/10 точно представима как 0.1 (1 × 10-1), но в системе с основанием 2 она является периодической (0.0001100110011...(2)).Значения типа float имеют точность 24 бита, а значения типа double — точность 53 бита. Поэтому, поскольку 0.1 является периодической дробью с четырёхбитным периодом в системе с основанием 2,
0.1f != 0.1d. Подробнее, включая шестнадцатеричные литералы с плавающей запятой:
- Точное числовое значение
0.1f(0x1.99999a0000000p-4f) равно 0.100000001490116119384765625. - Точное числовое значение
0.1d(0x1.999999999999ap-4d) равно 0.1000000000000000055511151231257827021181583404541015625.
float и double соответственно к числовому значению 0.1. Эти результаты согласуются с тем, что значение float имеет точность, эквивалентную 6–9 десятичным цифрам, а значение double — точность, эквивалентную 15–17 десятичным цифрам. (Эквивалентная точность меняется в зависимости от различной относительной плотности двоичных и десятичных значений в разных точках числовой прямой.) Этот риск, связанный с представлением десятичных дробей, — одна из причин соблюдать осторожность при хранении денежных значений в виде float или
double. Возможные альтернативы:
- использовать
BigDecimalдля точного хранения десятичных дробных значений - увеличить масштаб, чтобы денежное значение стало целым числом, — например, умножить его на 100, если значение выражено в центах, или на 1000, если оно выражено в милах, — а затем сохранить масштабированное значение в целочисленном типе
Для каждого конечного числа с плавающей запятой и заданного типа с плавающей запятой существует непрерывная область числовой прямой, которая отображается в это значение. При использовании политики округления к ближайшему по умолчанию (JLS 15.4) эта непрерывная область для значения обычно имеет ширину в одну ulp (единицу младшего разряда) и центрирована относительно точно представимого значения. (На границах показателей область асимметрична и шире со стороны большего показателя.) Например, для 0.1f область можно вычислить следующим образом:
// Numeric values listed are exact values
oneTenthApproxAsFloat = 0.100000001490116119384765625;
ulpOfoneTenthApproxAsFloat = Math.ulp(0.1f) = 7.450580596923828125E-9;
// Numeric range that is converted to the float closest to 0.1, _excludes_ endpoints
(oneTenthApproxAsFloat - ½ulpOfoneTenthApproxAsFloat, oneTenthApproxAsFloat + ½ulpOfoneTenthApproxAsFloat) =
(0.0999999977648258209228515625, 0.1000000052154064178466796875)
В частности, корректно округлённое преобразование десятичного числа в двоичное для любой строки, представляющей число в этом диапазоне, например с помощью Float.parseFloat(String), даст одно и то же значение:
Float.parseFloat("0.0999999977648258209228515625000001"); // rounds up to oneTenthApproxAsFloat
Float.parseFloat("0.099999998"); // rounds up to oneTenthApproxAsFloat
Float.parseFloat("0.1"); // rounds up to oneTenthApproxAsFloat
Float.parseFloat("0.100000001490116119384765625"); // exact conversion
Float.parseFloat("0.100000005215406417846679687"); // rounds down to oneTenthApproxAsFloat
Float.parseFloat("0.100000005215406417846679687499999"); // rounds down to oneTenthApproxAsFloat
Аналогично, для типа
double можно построить соответствующий диапазон на основе точного значения приближения double к 0.1d и числового значения
Math.ulp(0.1d), а также для других конкретных числовых значений типов float и double.
Как видно из приведённых выше преобразований, по сравнению с точным числовым значением, которое операция дала бы без округления, результатом может быть одно и то же число с плавающей запятой, которое:
- больше точного результата
- равно точному результату
- меньше точного результата
0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f + 0.1f;
// Numerical value of computed sum: 1.00000011920928955078125,
// the next floating-point value larger than 1.0f, equal to Math.nextUp(1.0f).
0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d + 0.1d;
// Numerical value of computed sum: 0.99999999999999988897769753748434595763683319091796875,
// the next floating-point value smaller than 1.0d, equal to Math.nextDown(1.0d).
double d = 0.0;
while (d != 1.0) { // Surprising infinite loop
d += 0.1; // Sum never _exactly_ equals 1.0
}
double d = 0.0;
for (int i = 0; i < 10; i++) {
d += 0.1;
} // Value of d is equal to Math.nextDown(1.0).
<, <=, >, >=): double d = 0.0;
while (d <= 1.0) {
d += 0.1;
} // Value of d approximately 1.0999999999999999
- См. Спецификацию языка Java:
- 4.2.3 Типы и значения с плавающей запятой
4.2.4 Операции с плавающей запятой
15.21.1 Операторы числового равенства == и !=
15.20.1 Операторы числового сравнения<,<=,>и>=
- Начиная с версии:
- 1.0
- Внешние спецификации
- См. также:
Краткое описание полей
| Модификатор и тип | Поле | Описание |
|---|---|---|
static final int |
BYTES |
Количество байтов, используемых для представления значения double, — 8. |
static final int |
MAX_EXPONENT |
Максимальный показатель, который может иметь конечная переменная double, — 1023. |
static final double |
MAX_VALUE |
Константа, содержащая наибольшее положительное конечное значение типа double: (2-2-52)·21023. |
static final int |
MIN_EXPONENT |
Минимальный показатель, который может иметь нормализованная переменная double, — -1022. |
static final double |
MIN_NORMAL |
Константа, содержащая наименьшее положительное нормальное значение типа double: 2-1022. |
static final double |
MIN_VALUE |
Константа, содержащая наименьшее положительное ненулевое значение типа double: 2-1074. |
static final double |
NaN |
Константа, содержащая значение «не число» (NaN) типа double. |
static final double |
NEGATIVE_INFINITY |
Константа, содержащая отрицательную бесконечность типа double. |
static final double |
POSITIVE_INFINITY |
Константа, содержащая положительную бесконечность типа double. |
static final int |
PRECISION |
Количество битов в значащей части значения double — 53. |
static final int |
SIZE |
Количество битов, используемых для представления значения double, — 64. |
static final Class |
TYPE |
Экземпляр Class, представляющий примитивный тип double. |
Краткое описание конструкторов
| Конструктор | Описание |
|---|---|
Double |
Устарел. Использование этого конструктора редко бывает оправданным. |
Double |
Устарел. Использование этого конструктора редко бывает оправданным. |
Краткое описание методов
| Модификатор и тип | Метод | Описание |
|---|---|---|
byte |
byteValue() |
Возвращает значение этого Double как byte после сужающего преобразования примитивного типа. |
static int |
compare |
Сравнивает два указанных значения double. |
int |
compareTo |
Сравнивает два объекта Double численно. |
Optional |
describeConstable() |
Возвращает Optional, содержащий номинальный дескриптор этого экземпляра, которым является сам экземпляр. |
static long |
doubleToLongBits |
Возвращает представление указанного числа с плавающей запятой в соответствии с битовой раскладкой формата «double» чисел с плавающей запятой IEEE 754. |
static long |
doubleToRawLongBits |
Возвращает представление указанного числа с плавающей запятой в соответствии с битовой раскладкой формата «double» чисел с плавающей запятой IEEE 754, сохраняя значения «не число» (NaN). |
double |
doubleValue() |
Возвращает значение double этого объекта Double. |
boolean |
equals |
Сравнивает этот объект с указанным объектом. |
float |
floatValue() |
Возвращает значение этого Double как float после сужающего преобразования примитивного типа. |
int |
hashCode() |
Возвращает хеш-код этого объекта Double. |
static int |
hashCode |
Возвращает хеш-код значения double; совместим с Double.hashCode(). |
int |
intValue() |
Возвращает значение этого Double как int после сужающего преобразования примитивного типа. |
static boolean |
isFinite |
Возвращает true, если аргумент является конечным числом с плавающей запятой; в противном случае возвращает false (для аргументов NaN и бесконечности). |
boolean |
isInfinite() |
Возвращает true, если абсолютная величина этого значения Double бесконечна, и false в противном случае. |
static boolean |
isInfinite |
Возвращает true, если абсолютная величина указанного числа бесконечна, и false в противном случае. |
boolean |
isNaN() |
Возвращает true, если это значение Double является значением «не число» (NaN), и false в противном случае. |
static boolean |
isNaN |
Возвращает true, если указанное число является значением «не число» (NaN), и false в противном случае. |
static double |
longBitsToDouble |
Возвращает значение double, соответствующее заданному битовому представлению. |
long |
longValue() |
Возвращает значение этого Double как long после сужающего преобразования примитивного типа. |
static double |
max |
Возвращает большее из двух значений double, как если бы был вызван метод Math.max. |
static double |
min |
Возвращает меньшее из двух значений double, как если бы был вызван метод Math.min. |
static double |
parseDouble |
Возвращает новый double, инициализированный значением, представленным указанным String, аналогично методу valueOf класса Double. |
Double |
resolveConstantDesc |
Разрешает этот экземпляр как ConstantDesc; результатом является сам экземпляр. |
short |
shortValue() |
Возвращает значение этого Double как short после сужающего преобразования примитивного типа. |
static double |
sum |
Складывает два значения double с помощью оператора +. |
static String |
toHexString |
Возвращает шестнадцатеричное строковое представление аргумента double. |
String |
toString() |
Возвращает строковое представление этого объекта Double. |
static String |
toString |
Возвращает строковое представление аргумента double. |
static Double |
valueOf |
Возвращает экземпляр Double, представляющий указанное значение double. |
static Double |
valueOf |
Возвращает объект Double, содержащий значение double, представленное строковым аргументом s. |
Подробное описание полей
POSITIVE_INFINITY
public static final double POSITIVE_INFINITY
double. Она равна значению, возвращаемому методом Double.longBitsToDouble(0x7ff0000000000000L).- См. также:
NEGATIVE_INFINITY
public static final double NEGATIVE_INFINITY
double. Она равна значению, возвращаемому методом Double.longBitsToDouble(0xfff0000000000000L).- См. также:
NaN
public static final double NaN
double. Она эквивалентна значению, возвращаемому методом Double.longBitsToDouble(0x7ff8000000000000L).- См. также:
MAX_VALUE
public static final double MAX_VALUE
double, (2-2-52)·21023. Оно равно шестнадцатеричному литералу с плавающей точкой 0x1.fffffffffffffP+1023, а также Double.longBitsToDouble(0x7fefffffffffffffL).- См. также:
MIN_NORMAL
public static final double MIN_NORMAL
double, 2-1022. Оно равно шестнадцатеричному литералу с плавающей точкой 0x1.0p-1022, а также Double.longBitsToDouble(0x0010000000000000L).- Начиная с:
- 1.6
- См. также:
MIN_VALUE
public static final double MIN_VALUE
double, 2-1074. Оно равно шестнадцатеричному литералу с плавающей точкой 0x0.0000000000001P-1022, а также Double.longBitsToDouble(0x1L).- См. также:
SIZE
public static final int SIZE
double: 64.- Начиная с:
- 1.5
- См. также:
PRECISION
public static final int PRECISION
double: 53. Это параметр N из раздела 4.2.3 Спецификации языка Java.- Начиная с:
- 19
- См. также:
MAX_EXPONENT
public static final int MAX_EXPONENT
double: 1023. Он равен значению, возвращаемому методом
Math.getExponent(Double.MAX_VALUE).- Начиная с:
- 1.6
- См. также:
MIN_EXPONENT
public static final int MIN_EXPONENT
double: -1022. Он равен значению, возвращаемому методом
Math.getExponent(Double.MIN_NORMAL).- Начиная с:
- 1.6
- См. также:
BYTES
public static final int BYTES
double: 8.- Начиная с:
- 1.8
- См. также:
TYPE
public static final Class<Double> TYPE
Class, представляющий примитивный тип double.- Начиная с:
- 1.1
Подробное описание конструкторов
Double
@Deprecated(since="9") public Double(double value)
valueOf(double), поскольку она, вероятно, обеспечивает значительно более высокую производительность по памяти и времени.Double, представляющий примитивный аргумент double.- Параметры:
-
value— значение, представляемое объектомDouble.
Double
@Deprecated(since="9") public Double(String s) throws NumberFormatException
double используйте parseDouble(String), а для преобразования строки в объект Double — valueOf(String).Double, представляющий значение с плавающей точкой типа double, заданное строкой. Строка преобразуется в значение double так же, как методом valueOf.- Параметры:
-
s— строка, преобразуемая вDouble. - Исключения:
-
NumberFormatException— если строка не содержит числа, которое можно разобрать.
Подробное описание методов
toString
public static String toString(double d)
double. Все упомянутые ниже символы являются символами ASCII. - Если аргумент равен NaN, результатом является строка "
NaN". - В противном случае результатом является строка, представляющая знак и величину (абсолютное значение) аргумента. Если знак отрицательный, первым символом результата является '
-' ('\u002D'); если знак положительный, в результате не отображается символ знака. Что касается величины m:- Если m равна бесконечности, она представляется символами
"Infinity"; поэтому положительная бесконечность дает результат"Infinity", а отрицательная —"-Infinity". - Если m равна нулю, она представляется символами
"0.0"; поэтому отрицательный ноль дает результат"-0.0", а положительный ноль —"0.0". - В противном случае m является положительной конечной величиной. Она преобразуется в строку в два этапа:
- Выбор десятичного числа: для представления m выбирается однозначно определенное десятичное число dm. Это десятичное число (почти всегда) является кратчайшим из тех, которые округляются до m согласно правилу округления к ближайшему в арифметике с плавающей точкой IEEE 754.
- Форматирование в виде строки: десятичное число dm форматируется в виде строки — обычной или в компьютерной экспоненциальной записи, в зависимости от его значения.
- Если m равна бесконечности, она представляется символами
Десятичное число — это число вида s×10i для некоторых (единственных) целых чисел s > 0 и i, где s не кратно 10. Эти целые числа являются соответственно значащей частью и показателем степени десятичного числа. Длина десятичного числа — это (единственное) положительное целое число n, удовлетворяющее условию 10n-1 ≤ s < 10n.
Десятичное число dm для конечного положительного m определяется следующим образом:
- Пусть R — множество всех десятичных чисел, которые округляются до m согласно обычному правилу округления к ближайшему в арифметике с плавающей точкой IEEE 754.
- Пусть p — минимальная длина среди всех десятичных чисел из R.
- Если p ≥ 2, пусть T — множество всех десятичных чисел из R длины p. В противном случае пусть T — множество всех десятичных чисел из R длины 1 или 2.
- Определим dm как десятичное число из T, наиболее близкое к m. Если таких чисел в T два, выбирается число с четной значащей частью.
Затем выбранное (единственным образом) десятичное число dm форматируется. Пусть s, i и n — значащая часть, показатель степени и длина dm соответственно. Кроме того, пусть e = n + i - 1, а s1…sn — обычная десятичная запись s. Обратите внимание, что s1 ≠ 0 и sn ≠ 0. Ниже десятичная точка '.' обозначается '\u002E', а индикатор показателя степени 'E' — '\u0045'.
- Случай -3 ≤ e < 0: dm форматируется как
0.0…0s1…sn, где между десятичной точкой и s1 находится ровно -(n + i) нулей. Например, 123 × 10-4 форматируется как0.0123. - Случай 0 ≤ e < 7:
- Подслучай i ≥ 0: dm форматируется как s1…sn
0…0.0, где между sn и десятичной точкой находится ровно i нулей. Например, 123 × 102 форматируется как12300.0. - Подслучай i < 0: dm форматируется как s1…sn+i
.sn+i+1…sn, где справа от десятичной точки находится ровно -i цифр. Например, 123 × 10-1 форматируется как12.3.
- Подслучай i ≥ 0: dm форматируется как s1…sn
- Случай e < -3 или e ≥ 7: для форматирования dm используется компьютерная экспоненциальная запись. Значение e форматируется так же, как методом
Integer.toString(int).- Подслучай n = 1: dm форматируется как s1
.0Ee. Например, 1 × 1023 форматируется как1.0E23. - Подслучай n > 1: dm форматируется как s1
.s2…snEe. Например, 123 × 10-21 форматируется как1.23E-19.
- Подслучай n = 1: dm форматируется как s1
Для создания локализованных строковых представлений значения с плавающей точкой используйте подклассы NumberFormat.
- Примечание API:
- Этот метод соответствует общей функциональности операции convertToDecimalCharacter, определенной в IEEE 754; однако эта операция определена через указание количества значащих цифр, используемых при преобразовании. Код для такого преобразования на платформе Java включает точное преобразование
doubleвBigDecimal, а затем округлениеBigDecimalдо требуемого количества цифр; пример кода:double d = 0.1; int digits = 25; BigDecimal bd = new BigDecimal(d); String result = bd.round(new MathContext(digits, RoundingMode.HALF_UP)); // 0.1000000000000000055511151 - Параметры:
-
d— преобразуемое значениеdouble. - Возвращает:
- строковое представление аргумента.
toHexString
public static String toHexString(double d)
double. Все упомянутые ниже символы являются символами ASCII. - Если аргумент равен NaN, результатом является строка "
NaN". - В противном случае результатом является строка, представляющая знак и величину аргумента. Если знак отрицательный, первым символом результата является '
-' ('\u002D'); если знак положительный, в результате не отображается символ знака. Что касается величины m:- Если m равна бесконечности, она представляется строкой
"Infinity"; поэтому положительная бесконечность дает результат"Infinity", а отрицательная —"-Infinity". - Если m равна нулю, она представляется строкой
"0x0.0p0"; поэтому отрицательный ноль дает результат"-0x0.0p0", а положительный ноль —"0x0.0p0". - Если m является значением
doubleс нормализованным представлением, для представления полей значащей части и показателя степени используются подстроки. Значащая часть представляется символами"0x1.", за которыми следует шестнадцатеричное представление дробной части оставшейся значащей части в нижнем регистре. Завершающие нули в шестнадцатеричном представлении удаляются, если только все цифры не равны нулю; в этом случае используется один ноль. Затем показатель степени представляется символом"p", за которым следует десятичная строка несмещенного показателя степени, полученная так же, как при вызовеInteger.toStringсо значением показателя степени. - Если m является значением
doubleс субнормальным представлением, значащая часть представляется символами"0x0.", за которыми следует шестнадцатеричное представление дробной части оставшейся значащей части. Завершающие нули в шестнадцатеричном представлении удаляются. Затем показатель степени представляется символом"p-1022". Обратите внимание, что в субнормальной значащей части должна быть как минимум одна ненулевая цифра.
- Если m равна бесконечности, она представляется строкой
| Значение с плавающей точкой | Шестнадцатеричная строка |
|---|---|
1.0 | 0x1.0p0 |
-1.0 | -0x1.0p0 |
2.0 | 0x1.0p1 |
3.0 | 0x1.8p1 |
0.5 | 0x1.0p-1 |
0.25 | 0x1.0p-2 |
Double.MAX_VALUE | 0x1.fffffffffffffp1023 |
Minimum Normal Value | 0x1.0p-1022 |
Maximum Subnormal Value | 0x0.fffffffffffffp-1022 |
Double.MIN_VALUE | 0x0.0000000000001p-1022 |
- Примечание API:
- Этот метод соответствует операции convertToHexCharacter, определенной в IEEE 754.
- Параметры:
-
d— преобразуемое значениеdouble. - Возвращает:
- шестнадцатеричное строковое представление аргумента.
- Начиная с:
- 1.5
valueOf
public static Double valueOf(String s) throws NumberFormatException
Double, содержащий значение double, представленное строкой-аргументом s. Если s равно null, выбрасывается NullPointerException.
Начальные и конечные пробельные символы в s игнорируются. Пробельные символы удаляются так же, как методом String.trim(); то есть удаляются как пробелы ASCII, так и управляющие символы. Оставшаяся часть s должна соответствовать FloatValue, описанному следующими правилами лексического синтаксиса:
где Sign, FloatingPointLiteral, HexNumeral, HexDigits, SignedInteger и FloatTypeSuffix определены в разделах о лексической структуре Спецификации языка Java, за исключением того, что между цифрами не допускаются символы подчеркивания. Если
- FloatValue:
- Signopt
NaN- Signopt
Infinity- Signopt FloatingPointLiteral
- Signopt HexFloatingPointLiteral
- SignedInteger
- HexFloatingPointLiteral:
- HexSignificand BinaryExponent FloatTypeSuffixopt
- HexSignificand:
- HexNumeral
- HexNumeral
.0xHexDigitsopt.HexDigits0XHexDigitsopt.HexDigits
- BinaryExponent:
- BinaryExponentIndicator SignedInteger
- BinaryExponentIndicator:
pP
s не имеет формы FloatValue, выбрасывается NumberFormatException. В противном случае считается, что s представляет точное десятичное значение в обычной «компьютерной экспоненциальной записи» или точное шестнадцатеричное значение; затем это точное числовое значение концептуально преобразуется в «бесконечно точное» двоичное значение, которое округляется до типа double по обычному правилу округления к ближайшему арифметики с плавающей точкой IEEE 754, включая сохранение знака нулевого значения. Обратите внимание, что правило округления к ближайшему также определяет поведение при переполнении и потере точности; если абсолютная величина точного значения s достаточно велика (больше или равна (MAX_VALUE + ulp(MAX_VALUE)/2), округление до double приведет к бесконечности, а если абсолютная величина точного значения s достаточно мала (меньше или равна MIN_VALUE/2), округление до float приведет к нулю. Наконец, после округления возвращается объект Double, представляющий это значение double. Обратите внимание, что завершающие спецификаторы формата, определяющие тип литерала с плавающей точкой (1.0f — значение float; 1.0d — значение double), не влияют на результат этого метода. Другими словами, числовое значение входной строки преобразуется непосредственно в целевой тип с плавающей точкой. Двухэтапная последовательность преобразований: строка в float, а затем float в double — не эквивалентна непосредственному преобразованию строки в double. Например, литерал float 0.1f равен значению double 0.10000000149011612; литерал float 0.1f представляет числовое значение, отличное от значения литерала double 0.1. (Числовое значение 0.1 невозможно точно представить двоичным числом с плавающей точкой.)
Чтобы не вызывать этот метод с недопустимой строкой и не допустить выбрасывания NumberFormatException, для проверки входной строки можно использовать следующее регулярное выражение:
final String Digits = "(\\p{Digit}+)";
final String HexDigits = "(\\p{XDigit}+)";
// an exponent is 'e' or 'E' followed by an optionally
// signed decimal integer.
final String Exp = "[eE][+-]?"+Digits;
final String fpRegex =
("[\\x00-\\x20]*"+ // Optional leading "whitespace"
"[+-]?(" + // Optional sign character
"NaN|" + // "NaN" string
"Infinity|" + // "Infinity" string
// A decimal floating-point string representing a finite positive
// number without a leading sign has at most five basic pieces:
// Digits . Digits ExponentPart FloatTypeSuffix
//
// Since this method allows integer-only strings as input
// in addition to strings of floating-point literals, the
// two sub-patterns below are simplifications of the grammar
// productions from section 3.10.2 of
// The Java Language Specification.
// Digits ._opt Digits_opt ExponentPart_opt FloatTypeSuffix_opt
"((("+Digits+"(\\.)?("+Digits+"?)("+Exp+")?)|"+
// . Digits ExponentPart_opt FloatTypeSuffix_opt
"(\\.("+Digits+")("+Exp+")?)|"+
// Hexadecimal strings
"((" +
// 0[xX] HexDigits ._opt BinaryExponent FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "(\\.)?)|" +
// 0[xX] HexDigits_opt . HexDigits BinaryExponent FloatTypeSuffix_opt
"(0[xX]" + HexDigits + "?(\\.)" + HexDigits + ")" +
")[pP][+-]?" + Digits + "))" +
"[fFdD]?))" +
"[\\x00-\\x20]*");// Optional trailing "whitespace"
if (Pattern.matches(fpRegex, myString))
Double.valueOf(myString); // Will not throw NumberFormatException
else {
// Perform suitable alternative action
}
- Примечание API:
- Для интерпретации локализованных строковых представлений значения с плавающей точкой или строковых представлений с цифрами, не входящими в ASCII, используйте
NumberFormat. Например,гдеNumberFormat.getInstance(l).parse(s).doubleValue();l— требуемая локаль, илиLocale.ROOT, если локаль не должна влиять на результат., Этот метод соответствует операциям convertFromDecimalCharacter и convertFromHexCharacter, определенным в IEEE 754. - Параметры:
-
s— анализируемая строка. - Возвращает:
- объект
Double, содержащий значение, представленное аргументомString. - Исключения:
-
NumberFormatException— если строка не содержит числа, которое можно разобрать. - См. также:
valueOf
public static Double valueOf(double d)
Double, представляющий указанное значение double. Если новый экземпляр Double не требуется, обычно следует предпочесть этот метод конструктору Double(double), поскольку этот метод, вероятно, обеспечивает значительно более высокую производительность по памяти и времени за счет кэширования часто запрашиваемых значений.- Параметры:
-
d— значение типа double. - Возвращает:
- экземпляр
Double, представляющийd. - Начиная с:
- 1.5
parseDouble
public static double parseDouble(String s) throws NumberFormatException
double, инициализированный значением, представленным указанным String, как это выполняется методом valueOf класса Double.- Параметры:
-
s— анализируемая строка. - Возвращает:
- значение
double, представленное строковым аргументом. - Исключения:
-
NullPointerException— если строка равна null -
NumberFormatException— если строка не содержит числаdouble, которое можно разобрать. - Начиная с:
- 1.2
- См. также:
isNaN
public static boolean isNaN(double v)
true, если указанное число является значением «не число» (NaN), и false в противном случае.- Примечание API:
- Этот метод соответствует операции isNaN, определенной в IEEE 754.
- Параметры:
-
v— проверяемое значение. - Возвращает:
-
true, если значение аргумента равно NaN; в противном случае —false.
isInfinite
public static boolean isInfinite(double v)
true, если абсолютная величина указанного числа бесконечно велика, и false в противном случае.- Примечание API:
- Этот метод соответствует операции isInfinite, определенной в IEEE 754.
- Параметры:
-
v— проверяемое значение. - Возвращает:
-
true, если значение аргумента является положительной или отрицательной бесконечностью; в противном случае —false.
isFinite
public static boolean isFinite(double d)
true, если аргумент является конечным значением с плавающей точкой; в противном случае (для аргументов NaN и бесконечность) возвращает false.- Примечание API:
- Этот метод соответствует операции isFinite, определенной в IEEE 754.
- Параметры:
-
d— проверяемое значениеdouble - Возвращает:
-
true, если аргумент является конечным значением с плавающей точкой; в противном случае —false. - Начиная с:
- 1.8
isNaN
public boolean isNaN()
true, если значение Double является значением «не число» (NaN), и false в противном случае.- Возвращает:
-
true, если значение, представленное этим объектом, равно NaN; в противном случае —false.
isInfinite
public boolean isInfinite()
true, если абсолютная величина значения Double бесконечно велика, и false в противном случае.- Возвращает:
-
true, если значение, представленное этим объектом, является положительной или отрицательной бесконечностью; в противном случае —false.
toString
public String toString()
Double. Примитивное значение double, представленное этим объектом, преобразуется в строку точно так же, как методом toString с одним аргументом.byteValue
public byte byteValue()
Double как byte после сужающего преобразования примитивного типа.- Переопределяет:
-
byteValueв классеNumber - Возвращает:
- значение
double, представленное этим объектом, преобразованное к типуbyte - См. Спецификацию языка Java:
- 5.1.3 Сужающее преобразование примитивного типа
- Начиная с:
- 1.1
shortValue
public short shortValue()
Double как short после сужающего примитивного преобразования.- Переопределяет:
-
shortValueв классеNumber - Возвращает:
- значение
double, представленное этим объектом и преобразованное к типуshort - См. Спецификацию языка Java:
- 5.1.3 Сужающее примитивное преобразование
- Начиная с версии:
- 1.1
intValue
public int intValue()
Double как int после сужающего примитивного преобразования.- Определено в:
-
intValueв классеNumber - Примечание к API:
- Этот метод соответствует операции convertToIntegerTowardZero, определённой в IEEE 754.
- Возвращает:
- значение
double, представленное этим объектом и преобразованное к типуint - См. Спецификацию языка Java:
- 5.1.3 Сужающее примитивное преобразование
longValue
public long longValue()
Double как long после сужающего примитивного преобразования.- Определено в:
-
longValueв классеNumber - Примечание к API:
- Этот метод соответствует операции convertToIntegerTowardZero, определённой в IEEE 754.
- Возвращает:
- значение
double, представленное этим объектом и преобразованное к типуlong - См. Спецификацию языка Java:
- 5.1.3 Сужающее примитивное преобразование
floatValue
public float floatValue()
Double как float после сужающего примитивного преобразования.- Определено в:
-
floatValueв классеNumber - Примечание к API:
- Этот метод соответствует операции convertFormat, определённой в IEEE 754.
- Возвращает:
- значение
double, представленное этим объектом и преобразованное к типуfloat - См. Спецификацию языка Java:
- 5.1.3 Сужающее примитивное преобразование
- Начиная с версии:
- 1.0
doubleValue
public double doubleValue()
double этого объекта Double.- Определено в:
-
doubleValueв классеNumber - Возвращает:
- значение
double, представленное этим объектом
hashCode
public int hashCode()
Double. Результат представляет собой исключающее ИЛИ двух половин целочисленного битового представления long, в точности полученного методом doubleToLongBits(double) для примитивного значения double, представленного этим объектом Double. То есть хеш-код равен значению выражения: (int)(v^(v>>>32)) где v определяется следующим образом: long v = Double.doubleToLongBits(this.doubleValue());
hashCode
public static int hashCode(double value)
double; совместим с Double.hashCode().- Параметры:
-
value— значение для вычисления хеша - Возвращает:
- значение хеш-кода для значения
double. - Начиная с версии:
- 1.8
equals
public boolean equals(Object obj)
true тогда и только тогда, когда аргумент не равен null и является объектом Double, представляющим double, имеющее то же значение, что и double, представленное этим объектом. Для этой цели два значения double считаются одинаковыми тогда и только тогда, когда метод doubleToLongBits(double), применённый к каждому из них, возвращает одинаковое значение long.- Переопределяет:
-
equalsв классеObject - Примечание к API:
- Этот метод определён через
doubleToLongBits(double), а не через оператор==для значенийdouble, поскольку оператор==не задаёт отношение эквивалентности, а для соблюдения контракта equals необходимо реализовать отношение эквивалентности; подробности о равенстве и эквивалентности чисел с плавающей точкой см. в этом обсуждении. - Параметры:
-
obj— объект-ссылка, с которым выполняется сравнение. - Возвращает:
-
true, если этот объект совпадает с аргументом obj; в противном случае —false. - См. Спецификацию языка Java:
- 15.21.1 Операторы числового равенства == и !=
- См. также:
doubleToLongBits
public static long doubleToLongBits(double value)
Бит 63 (бит, выбираемый маской 0x8000000000000000L) обозначает знак числа с плавающей точкой. Биты 62–52 (биты, выбираемые маской 0x7ff0000000000000L) обозначают экспоненту. Биты 51–0 (биты, выбираемые маской 0x000fffffffffffffL) обозначают значащую часть (иногда называемую мантиссой) числа с плавающей точкой.
Если аргумент — положительная бесконечность, результат равен 0x7ff0000000000000L.
Если аргумент — отрицательная бесконечность, результат равен 0xfff0000000000000L.
Если аргумент — NaN, результат равен 0x7ff8000000000000L.
Во всех случаях результатом является целое число long, передача которого методу longBitsToDouble(long) создаст значение с плавающей точкой, совпадающее с аргументом doubleToLongBits (за исключением того, что все значения NaN сводятся к одному «каноническому» значению NaN).
- Параметры:
-
value— число с плавающей точкой двойной точностиdouble. - Возвращает:
- биты, представляющие число с плавающей точкой.
doubleToRawLongBits
public static long doubleToRawLongBits(double value)
Бит 63 (бит, выбираемый маской 0x8000000000000000L) обозначает знак числа с плавающей точкой. Биты 62–52 (биты, выбираемые маской 0x7ff0000000000000L) обозначают экспоненту. Биты 51–0 (биты, выбираемые маской 0x000fffffffffffffL) обозначают значащую часть (иногда называемую мантиссой) числа с плавающей точкой.
Если аргумент — положительная бесконечность, результат равен 0x7ff0000000000000L.
Если аргумент — отрицательная бесконечность, результат равен 0xfff0000000000000L.
Если аргумент — NaN, результатом является целое число long, представляющее фактическое значение NaN. В отличие от метода doubleToLongBits, метод doubleToRawLongBits не сводит все битовые шаблоны, кодирующие NaN, к одному «каноническому» значению NaN.
Во всех случаях результатом является целое число long, передача которого методу longBitsToDouble(long) создаст значение с плавающей точкой, совпадающее с аргументом doubleToRawLongBits.
- Параметры:
-
value— число с плавающей точкой двойной точностиdouble. - Возвращает:
- биты, представляющие число с плавающей точкой.
- Начиная с версии:
- 1.3
longBitsToDouble
public static double longBitsToDouble(long bits)
double, соответствующее заданному битовому представлению. Аргумент считается представлением значения с плавающей точкой согласно битовой раскладке формата double с плавающей точкой IEEE 754. Если аргумент равен 0x7ff0000000000000L, результатом является положительная бесконечность.
Если аргумент равен 0xfff0000000000000L, результатом является отрицательная бесконечность.
Если аргумент находится в диапазоне от 0x7ff0000000000001L до 0x7fffffffffffffffL или в диапазоне от 0xfff0000000000001L до 0xffffffffffffffffL, результатом является NaN. Ни одна операция с плавающей точкой IEEE 754, предоставляемая Java, не может различить два значения NaN одного типа с разными битовыми шаблонами. Различить отдельные значения NaN можно только с помощью метода Double.doubleToRawLongBits.
Во всех остальных случаях пусть s, e и m — три значения, вычисляемые из аргумента:
int s = ((bits >> 63) == 0) ? 1 : -1;
int e = (int)((bits >> 52) & 0x7ffL);
long m = (e == 0) ?
(bits & 0xfffffffffffffL) << 1 :
(bits & 0xfffffffffffffL) | 0x10000000000000L;
Обратите внимание, что этот метод может быть не в состоянии вернуть значение NaN double с тем же битовым шаблоном, что и у аргумента long. IEEE 754 различает два вида NaN: тихие NaN и сигнальные NaN. Различия между этими двумя видами NaN, как правило, незаметны в Java. Арифметические операции над сигнальными NaN преобразуют их в тихие NaN с другим, но часто похожим битовым шаблоном. Однако на некоторых процессорах даже простое копирование сигнального NaN выполняет такое преобразование. В частности, это преобразование может произойти при копировании сигнального NaN для возврата его вызывающему методу. Поэтому метод longBitsToDouble может быть не в состоянии вернуть double с битовым шаблоном сигнального NaN. Следовательно, для некоторых значений long метод doubleToRawLongBits(longBitsToDouble(start)) может не совпадать с start. Кроме того, конкретные битовые шаблоны, представляющие сигнальные NaN, зависят от платформы; при этом все битовые шаблоны NaN — тихие и сигнальные — должны находиться в указанном выше диапазоне NaN.
- Параметры:
-
bits— любое целое числоlong. - Возвращает:
- значение с плавающей точкой
doubleс тем же битовым шаблоном.
compareTo
public int compareTo(Double anotherDouble)
Double численно. Этот метод задаёт полный порядок для объектов Double, который отличается от неполного порядка, определяемого операторами числового сравнения языка Java (<, <=,
==, >=, >) для значений double, в двух отношениях. - NaN не имеет определённого порядка относительно других значений и не равен самому себе при использовании операторов сравнения. Этот метод определяет, что
Double.NaNравно самому себе и больше всех остальных значенийdouble(включаяDouble.POSITIVE_INFINITY). - Положительный и отрицательный ноль численно равны при сравнении, но являются разными и различимыми значениями. Этот метод определяет, что положительный ноль (
+0.0d) больше отрицательного нуля (-0.0d).
Double, задаваемый этим методом, согласуется с equals; подробности сравнения и упорядочения чисел с плавающей точкой см. в этом обсуждении.- Определено в:
-
compareToв интерфейсеComparable<Double> - Параметры:
-
anotherDouble— объектDoubleдля сравнения. - Возвращает:
- значение
0, еслиanotherDoubleчисленно равно этомуDouble; значение меньше0, если этоDoubleчисленно меньшеanotherDouble; и значение больше0, если этоDoubleчисленно большеanotherDouble. - См. Спецификацию языка Java:
- 15.20.1 Операторы числового сравнения
<,<=,>и>=
- Начиная с версии:
- 1.2
compare
public static int compare(double d1, double d2)
double. Знак возвращаемого целочисленного значения совпадает со знаком целого числа, которое вернул бы вызов: Double.valueOf(d1).compareTo(Double.valueOf(d2))
- Параметры:
-
d1— первое значениеdoubleдля сравнения -
d2— второе значениеdoubleдля сравнения - Возвращает:
- значение
0, еслиd1численно равноd2; значение меньше0, еслиd1численно меньшеd2; и значение больше0, еслиd1численно большеd2. - Начиная с версии:
- 1.4
sum
public static double sum(double a, double b)
double, как это делает оператор +.- Примечание к API:
- Этот метод соответствует операции сложения, определённой в IEEE 754.
- Параметры:
-
a— первый операнд -
b— второй операнд - Возвращает:
- сумму
aиb - См. Спецификацию языка Java:
- 4.2.4 Операции с плавающей точкой
- Начиная с версии:
- 1.8
- См. также:
max
public static double max(double a, double b)
double, как если бы был вызван метод Math.max.- Примечание к API:
- Этот метод соответствует операции вычисления максимума, определённой в IEEE 754.
- Параметры:
-
a— первый операнд -
b— второй операнд - Возвращает:
- большее из
aиb - Начиная с версии:
- 1.8
- См. также:
min
public static double min(double a, double b)
double, как если бы был вызван метод Math.min.- Примечание к API:
- Этот метод соответствует операции вычисления минимума, определённой в IEEE 754.
- Параметры:
-
a— первый операнд -
b— второй операнд - Возвращает:
- меньшее из
aиb. - Начиная с версии:
- 1.8
- См. также:
describeConstable
public Optional<Double> describeConstable()
Optional, содержащий номинальный дескриптор этого экземпляра, которым является сам экземпляр.- Определено в:
-
describeConstableв интерфейсеConstable - Возвращает:
Optional, описывающий экземпляр Double- Начиная с версии:
- 12
resolveConstantDesc
public Double resolveConstantDesc(MethodHandles.Lookup lookup)
ConstantDesc; результатом является сам экземпляр.- Определено в:
-
resolveConstantDescв интерфейсеConstantDesc - Параметры:
-
lookup— игнорируется - Возвращает:
- экземпляр Double
- Начиная с версии:
- 12
© 1993, 2025, Oracle and/or its affiliates. All rights reserved.
Documentation extracted from Debian's OpenJDK Development Kit package.
Licensed under the GNU General Public License, version 2, with the Classpath Exception.
Various third party code in OpenJDK is licensed under different licenses (see Debian package).
Java and OpenJDK are trademarks or registered trademarks of Oracle and/or its affiliates.
https://docs.oracle.com/en/java/javase/25/docs/api/java.base/java/lang/Double.html