Spec-Zone.ru › OpenJDK 24

Класс Double

java.lang.Object
java.lang.Number
java.lang.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 как равных друг другу позволяет использовать NaN в качестве элемента HashSet или в качестве ключа HashMap. Аналогично, определение compareTo как полного порядка, включающего +0.0, -0.0 и NaN, позволяет использовать экземпляры оберточных классов в качестве элементов SortedSet или в качестве ключей SortedMap.

Сравнение числового равенства с различными полезными отношениями эквивалентности, которые можно определить для значений с плавающей точкой:

числовое равенство (оператор ==): (Не является отношением эквивалентности)
Два значения с плавающей точкой представляют одно и то же расширенное действительное число. Расширенные действительные числа — это действительные числа, дополненные положительной и отрицательной бесконечностью. При числовом равенстве +0.0 и -0.0 равны, так как они оба отображаются на одно и то же действительное значение, 0. NaN не отображается на любое действительное число и не равно ни одному значению, включая себя.
побитовая эквивалентность:
Биты двух значений с плавающей точкой одинаковы. Это отношение эквивалентности для значений double a и 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.

Проблемы преобразования десятичного в двоичный

Многие удивительные результаты двоичной арифметики с плавающей точкой восходят к аспектам преобразования десятичного в двоичный и двоичного в десятичный. Хотя целые значения могут быть точно представлены в любой системе счисления, значения дробей, которые могут быть точно представлены в системе счисления, зависят от системы счисления. Например, в десятичной системе 1/3 — это повторяющаяся дробь (0,33333...); но в троичной системе 1/3 точно равно 0,1(3), то есть 1 × 3-1. Аналогично, в десятичной системе 1/10 точно представимо как 0,1 (1 × 10-1), но в двоичной системе это повторяющаяся дробь (0,0001100110011...(2)).

Значения типа float имеют 24 бита точности, а значения типа double имеют 53 бита точности. Следовательно, так как 0,1 — это повторяющаяся дробь в двоичной системе с четырёхбитным повторением, 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 участок можно вычислить следующим образом:
// Численные значения приведены точно
oneTenthApproxAsFloat = 0.100000001490116119384765625;
ulpOfoneTenthApproxAsFloat = Math.ulp(0.1f) = 7.450580596923828125E-9;
// Численный диапазон, который преобразуется в ближайшее к 0.1 значение с плавающей точкой, _не включая_ конечные точки
(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).
не должна ожидаться равной точно 1.0, а только близкой к 1.0. Вследствие этого следующий код является бесконечным циклом:
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
Хотя арифметика с плавающей точкой может давать неожиданные результаты, арифметика с плавающей точкой IEEE 754 имеет продуманный дизайн и ее поведение предсказуемо на платформе Java.
См. Спецификацию языка Java:
4.2.3 Типы и значения с плавающей точкой
4.2.4 Операции с плавающей точкой
15.21.1 Числовые операторы равенства == и !=
15.20.1 Числовые операторы сравнения <, <=, > и >=
С момента:
1.0
Внешние спецификации
  • Стандарт IEEE для арифметики с плавающей точкой
См. также:
  • Сериализованная форма

Краткое описание полей

Модификатор и тип Поле Описание
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<Double> TYPE
Экземпляр Class, представляющий примитивный тип double.

Краткое описание конструкторов

Конструктор Описание
Double(double value)
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии.
Использование этого конструктора редко оправдано.
Double(String s)
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии.
Использование этого конструктора редко оправдано.

Краткое описание методов

Модификатор и тип Метод Описание
byte byteValue()
Возвращает значение этого Double в виде byte после сужения примитивного преобразования.
static int compare(double d1, double d2)
Сравнивает два заданных значения double.
int compareTo(Double anotherDouble)
Числовое сравнение двух объектов Double.
Optional<Double> describeConstable()
Возвращает Optional, содержащий номинальный дескриптор для этого экземпляра, который является самим экземпляром.
static long doubleToLongBits(double value)
Возвращает представление заданного значения с плавающей точкой согласно битовому представлению формата IEEE 754 "double".
static long doubleToRawLongBits(double value)
Возвращает представление заданного значения с плавающей точкой согласно битовому представлению формата IEEE 754 "double", сохраняя значения "Не число" (NaN).
double doubleValue()
Возвращает значение double этого объекта Double.
boolean equals(Object obj)
Сравнивает этот объект с указанным объектом.
float floatValue()
Возвращает значение этого Double в виде float после сужения примитивного преобразования.
int hashCode()
Возвращает хэш-код для этого объекта Double.
static int hashCode(double value)
Возвращает хэш-код для значения double; совместимо с Double.hashCode().
int intValue()
Возвращает значение этого Double в виде int после сужения примитивного преобразования.
static boolean isFinite(double d)
Возвращает true, если аргумент является конечным значением с плавающей точкой; возвращает false в противном случае (для NaN и бесконечных аргументов).
boolean isInfinite()
Возвращает true, если это значение Double бесконечно по модулю; возвращает false в противном случае.
static boolean isInfinite(double v)
Возвращает true, если заданное число бесконечно по модулю; возвращает false в противном случае.
boolean isNaN()
Возвращает true, если это значение Double является значением «Не число» (NaN); возвращает false в противном случае.
static boolean isNaN(double v)
Возвращает true, если указанное число является значением «Не число» (NaN); возвращает false в противном случае.
static double longBitsToDouble(long bits)
Возвращает значение double, соответствующее заданному битовому представлению.
long longValue()
Возвращает значение этого Double в виде long после сужения примитивного преобразования.
static double max(double a, double b)
Возвращает большее из двух значений double, как если бы вызывался Math.max.
static double min(double a, double b)
Возвращает меньшее из двух значений double, как если бы вызывался Math.min.
static double parseDouble(String s)
Возвращает новый double, инициализированный значением, представленным заданным String, как выполняется метод valueOf класса Double.
Double resolveConstantDesc(MethodHandles.Lookup lookup)
Разрешает этот экземпляр как ConstantDesc, результатом чего является сам экземпляр.
short shortValue()
Возвращает значение этого Double в виде short после сужения примитивного преобразования.
static double sum(double a, double b)
Складывает два значения double вместе по правилам оператора +.
static String toHexString(double d)
Возвращает шестнадцатеричное строковое представление аргумента double.
String toString()
Возвращает строковое представление этого объекта Double.
static String toString(double d)
Возвращает строковое представление аргумента double.
static Double valueOf(double d)
Возвращает экземпляр Double, представляющий заданное значение double.
static Double valueOf(String s)
Возвращает объект Double, содержащий значение double, представленное строкой-аргументом s.

Методы, унаследованные от класса java.lang.Object

clone, finalize, getClass, notify, notifyAll, wait, wait, wait

Подробное описание полей

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
Постоянная, хранящая значение «Не число» (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", forRemoval=true) public Double(double value)
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии.
Редко целесообразно использовать этот конструктор. Статический метод-фабрика valueOf(double) обычно является лучшим выбором, так как он, вероятно, обеспечит значительно лучшую производительность с точки зрения места и времени.
Создаёт новый объект Double, который представляет примитивное значение double.
Параметры:
value - значение, которое должно представляться объектом Double.

Double

@Deprecated(since="9", forRemoval=true) public Double(String s) throws NumberFormatException
Устаревший, для удаления: Этот элемент API может быть удален в будущей версии.
Редко целесообразно использовать этот конструктор. Используйте 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 — положительное и конечное значение. Оно преобразуется в строку в два этапа:
      • Выбор десятичного представления: Выбирается хорошо определённое десятичное число dm для представления m. Это десятичное число (почти всегда) является кратчайшим, которое округляется до m в соответствии с политикой округления до ближайшего значения IEEE 754 для чисел с плавающей запятой.
      • Форматирование как строки: Десятичное число dm форматируется как строка, либо в обычном, либо в компьютерном научном формате, в зависимости от его значения.

Десятичное число — это число вида 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, где ровно -(n + i) нулей находятся между десятичной точкой и s1. Например, 123 × 10-4 форматируется как 0.0123.
  • Случай 0 ≤ e < 7:
    • Подслучай i ≥ 0: dm форматируется как s1…sn0…0.0, где ровно i нулей находятся между sn и десятичной точкой. Например, 123 × 102 форматируется как 12300.0.
    • Подслучай i < 0: dm форматируется как s1…sn+i.sn+i+1…sn, где ровно -i цифр находятся справа от десятичной точки. Например, 123 × 10-1 форматируется как 12.3.
  • Случай 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.

Для создания локальных строковых представлений значения с плавающей запятой используйте подклассы NumberFormat.

API Note:
Этот метод соответствует общей функциональности операции 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 — значение с нормализованным представлением, подстроки используются для представления полей мантиссы и экспоненты. Мантисса представляется символами "0x1.", за которыми следует шестнадцатеричное представление оставшейся части мантиссы в виде дроби. Конечные нули в шестнадцатеричном представлении удаляются, за исключением случая, когда все цифры равны нулю, в этом случае используется единичный ноль. Далее, экспонента представляется символами "p", за которыми следует десятичная строка несмещённой экспоненты, как если бы она была получена вызовом Integer.toString для значения экспоненты.
    • Если m — значение с поднормализованным представлением, мантисса представляется символами "0x0.", за которыми следует шестнадцатеричное представление оставшейся части мантиссы в виде дроби. Конечные нули в шестнадцатеричном представлении удаляются. Далее, экспонента представляется символами "p-1022". Обратите внимание, что в поднормализованной мантиссе должна быть хотя бы одна ненулевая цифра.
Примеры
Значение с плавающей запятой Шестнадцатеричная строка
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 Note:
Этот метод соответствует операции convertToHexCharacter, определённой в IEEE 754.
Параметры:
d - преобразуемое double.
Возвращает:
шестнадцатеричное строковое представление аргумента.
С:
1.5

valueOf

public static Double valueOf(String s) throws NumberFormatException
Возвращает объект типа Double, содержащий значение, представленное строкой-аргументом s.

Если s является null, то генерируется исключение NullPointerException.

Пробельные символы в начале и конце строки s игнорируются. Пробелы удаляются так же, как и методом String.trim(); то есть удаляются как ASCII пробелы, так и управляющие символы. Остальная часть s должна представлять собой FloatValue, согласно правилам лексического синтаксиса:

FloatValue:
Signopt NaN
Signopt Infinity
Signopt FloatingPointLiteral
Signopt HexFloatingPointLiteral
SignedInteger
HexFloatingPointLiteral:
HexSignificand BinaryExponent FloatTypeSuffixopt
HexSignificand:
HexNumeral
HexNumeral .
0x HexDigitsopt . HexDigits
0X HexDigitsopt . HexDigits
BinaryExponent:
BinaryExponentIndicator SignedInteger
BinaryExponentIndicator:
p
P
где Sign, FloatingPointLiteral, HexNumeral, HexDigits, SignedInteger и FloatTypeSuffix определены в разделе лексической структуры Спецификации языка Java, за исключением того, что символы подчеркивания не допускаются между цифрами. Если 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; числовая константа 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
См. также:
  • valueOf(String)
  • Вопросы преобразования десятичного в двоичное

isNaN

public static boolean isNaN(double v)
Возвращает true, если заданное число является значением Not-a-Number (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, если аргумент является конечным значением с плавающей точкой; возвращает false в противном случае (для аргументов NaN и бесконечности).
Примечание API:
Этот метод соответствует операции isFinite, определенной в IEEE 754.
Параметры:
d - значение с плавающей точкой для проверки
Возвращает:
true, если аргумент является конечным значением с плавающей точкой, false в противном случае.
С тех пор:
1.8

isNaN

public boolean isNaN()
Возвращает true, если значение этого объекта Double равно Not-a-Number (NaN), false в противном случае.
Возвращает:
true, если значение, представленное этим объектом, равно NaN; false в противном случае.

isInfinite

public boolean isInfinite()
Возвращает true, если значение этого объекта Double бесконечно велико по модулю, false в противном случае.
Возвращает:
true, если значение, представленное этим объектом, равно положительной или отрицательной бесконечности; false в противном случае.

toString

public String toString()
Возвращает строковое представление этого объекта Double. Значение типа примитивного типа double, представленное этим объектом, преобразуется в строку точно так же, как и методом toString с одним аргументом.
Переопределяет:
toString в классе Object
Возвращает:
строковое представление этого объекта.
См. также:
  • toString(double)

byteValue

public byte byteValue()
Возвращает значение этого Double в виде byte после сужающего преобразования примитивного типа.
Overrides:
byteValue в классе Number
Returns:
значение double, представленное этим объектом, преобразованное к типу byte
См. Спецификацию языка Java:
5.1.3 Преобразование сужающего примитивного типа
Since:
1.1

shortValue

public short shortValue()
Возвращает значение этого Double в виде short после сужающего преобразования примитивного типа.
Overrides:
shortValue в классе Number
Returns:
значение double, представленное этим объектом, преобразованное к типу short
См. Спецификацию языка Java:
5.1.3 Преобразование сужающего примитивного типа
Since:
1.1

intValue

public int intValue()
Возвращает значение этого Double как int после сужающего преобразования примитивного типа.
Specified by:
intValue в классе Number
Примечание API:
Этот метод соответствует операции convertToIntegerTowardZero, определенной в IEEE 754.
Returns:
значение double, представленное этим объектом, преобразованное к типу int
См. Спецификацию языка Java:
5.1.3 Преобразование сужающего примитивного типа

longValue

public long longValue()
Возвращает значение этого Double как long после сужающего преобразования примитивного типа.
Specified by:
longValue в классе Number
Примечание API:
Этот метод соответствует операции convertToIntegerTowardZero, определенной в IEEE 754.
Returns:
значение double, представленное этим объектом, преобразованное к типу long
См. Спецификацию языка Java:
5.1.3 Преобразование сужающего примитивного типа

floatValue

public float floatValue()
Возвращает значение этого Double как float после сужающего преобразования примитивного типа.
Specified by:
floatValue в классе Number
Примечание API:
Этот метод соответствует операции convertFormat, определенной в IEEE 754.
Returns:
значение double, представленное этим объектом, преобразованное к типу float
См. Спецификацию языка Java:
5.1.3 Преобразование сужающего примитивного типа
Since:
1.0

doubleValue

public double doubleValue()
Возвращает значение с плавающей запятой двойной точности этого объекта Double.
Specified by:
doubleValue в классе Number
Returns:
значение с плавающей запятой двойной точности, представленное этим объектом

hashCode

public int hashCode()
Возвращает код хэша для этого объекта Double. Результатом является исключающее ИЛИ двух половин целочисленного представления в формате long, точно так, как производится методом doubleToLongBits(double) для значения примитивного типа double, представленного этим объектом Double. То есть, код хэша — это значение выражения:
(int)(v^(v>>>32))
где v определяется как:
long v = Double.doubleToLongBits(this.doubleValue());
Overrides:
hashCode в классе Object
Returns:
значение hash code для этого объекта.
См. также:
  • Object.equals(java.lang.Object)
  • System.identityHashCode(java.lang.Object)

hashCode

public static int hashCode(double value)
Возвращает код хэша для значения double; совместимо с Double.hashCode().
Parameters:
value - значение, для которого нужно вычислить код хэша
Returns:
значение кода хэша для значения double.
Since:
1.8

equals

public boolean equals(Object obj)
Сравнивает этот объект с указанным объектом. Результатом является true тогда и только тогда, когда аргумент не null и является объектом типа Double, представляющим значение с плавающей запятой двойной точности, имеющее то же значение, что и значение с плавающей запятой двойной точности, представленное этим объектом. Для этой цели два значения с плавающей запятой двойной точности считаются одинаковыми тогда и только тогда, когда метод doubleToLongBits(double) возвращает одинаковое значение long, когда применяется к каждому из них.
Overrides:
equals в классе Object
Примечание API:
Этот метод определен в терминах doubleToLongBits(double) вместо оператора == на значениях double, так как оператор == не определяет отношение эквивалентности, и для удовлетворения контракта `equals` должна быть реализована эквивалентность; см. это обсуждение для получения подробностей о равенстве и эквивалентности с плавающей запятой.
Parameters:
obj - объект-ссылка, с которым следует сравнить.
Returns:
true, если этот объект такой же, как аргумент obj; false в противном случае.
См. Спецификацию языка Java:
15.21.1 Операторы числового равенства == и !=
См. также:
  • doubleToLongBits(double)

doubleToLongBits

public static long doubleToLongBits(double value)
Возвращает представление указанного значения с плавающей запятой двойной точности в соответствии с битовым представлением формата "double" стандарта IEEE 754.

Бит 63 (выбираемый маской 0x8000000000000000L) представляет знак числа с плавающей запятой. Биты 62-52 (выбираемые маской 0x7ff0000000000000L) представляют показатель степени. Биты 51-0 (выбираемые маской 0x000fffffffffffffL) представляют мантиссу (иногда называемую значащими цифрами) числа с плавающей запятой.

Если аргумент — положительная бесконечность, результат — 0x7ff0000000000000L.

Если аргумент — отрицательная бесконечность, результат — 0xfff0000000000000L.

Если аргумент — NaN, результат — 0x7ff8000000000000L.

Во всех случаях результат — целое число long, которое, при передаче методу longBitsToDouble(long), произведёт значение с плавающей запятой, такое же, как аргумент для doubleToLongBits (за исключением всех значений NaN, которые сводятся к одному "каноническому" значению NaN).

Parameters:
value - число с плавающей запятой двойной точности.
Returns:
биты, представляющие число с плавающей запятой.

doubleToRawLongBits

public static long doubleToRawLongBits(double value)
Возвращает представление указанного значения с плавающей запятой двойной точности в соответствии с битовым представлением формата "double" стандарта IEEE 754, сохраняя значения Not-a-Number (NaN).

Бит 63 (выбираемый маской 0x8000000000000000L) представляет знак числа с плавающей запятой. Биты 62-52 (выбираемые маской 0x7ff0000000000000L) представляют показатель степени. Биты 51-0 (выбираемые маской 0x000fffffffffffffL) представляют мантиссу (иногда называемую значащими цифрами) числа с плавающей запятой.

Если аргумент — положительная бесконечность, результат — 0x7ff0000000000000L.

Если аргумент — отрицательная бесконечность, результат — 0xfff0000000000000L.

Если аргумент — NaN, результат — целое число long, представляющее фактическое значение NaN. В отличие от метода doubleToLongBits, метод doubleToRawLongBits не сводит все битовые шаблоны, кодирующие NaN, к одному "каноническому" значению NaN.

Во всех случаях результат — целое число long, которое, при передаче методу longBitsToDouble(long), произведёт значение с плавающей запятой, такое же, как аргумент для doubleToRawLongBits.

Parameters:
value - число с плавающей запятой двойной точности.
Returns:
биты, представляющие число с плавающей запятой.
Since:
1.3

longBitsToDouble

public static double longBitsToDouble(long bits)
Возвращает значение типа 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;
Тогда результат с плавающей точкой равен значению математического выражения s·m·2e-1075.

Обратите внимание, что этот метод может не быть способен вернуть double NaN с точно таким же битовым шаблоном, как и аргумент 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
См. также:
  • BinaryOperator

max

public static double max(double a, double b)
Возвращает большее из двух значений double, как если бы было вызвано Math.max.
Прим. API:
Этот метод соответствует операции нахождения максимума, определенной в IEEE 754.
Параметры:
a - первый операнд
b - второй операнд
Возвращает:
большее из a и b
С:
1.8
См. также:
  • BinaryOperator

min

public static double min(double a, double b)
Возвращает меньшее из двух значений double, как если бы было вызвано Math.min.
Прим. API:
Этот метод соответствует операции нахождения минимума, определенной в IEEE 754.
Параметры:
a - первый операнд
b - второй операнд
Возвращает:
меньшее из a и b.
С:
1.8
См. также:
  • BinaryOperator

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://download.java.net/java/early_access/jdk24/docs/api/java.base/java/lang/Double.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API