Существует ли числовой тип (примитив или класс) в Java, который содержит все остальные числовые типы?
Нет.
Начиная с примитивных типов:
- a
byte
не содержит всех short
значений - a
short
или char
не содержит всех int
значений. - an
int
не содержит всех значений long
. - a
long
не содержит всех float
значений. - a
float
не содержит все значения double
.
Вышеизложенное очевидно из диапазонов соответствующих типов.
- a
double
не содержит всех значений long
.
Это не так уж и очевидно. Диапазон double
больше, чем диапазон long
, но double
имеет только 53 бита точности. Если вы выполните математические вычисления, это означает, что есть числа (целые числа) в диапазоне long
, которые не могут иметь точное представление в виде double
значений. Long.MAX_VALUE
будет одним примером.
А как насчет BigInteger
и BigDecimal
.
BigInteger
не включает значения в double
, которые не целые числа.
BigDecimal
не включает значения, которые соответствуют значениям ± INF или ± NaN в double
Можно ли преобразовать любое число в Double в Java?
Нет, как описано выше. Некоторым значениям long
не соответствует значение double
. Здесь есть BigInteger
и BigDecimal
значения.
Если нет, существует ли класс Number, который мог бы анализировать любой числовой тип и который обеспечивал бы базовые c математические операции?
Если вы готовы сбрасывать со счетов значения INF и NaN и использовать достаточно большое precision
в MathContext
, тогда BigDecimal
должно быть достаточно ... в пределах машинной памяти и реализация.
(Текущий класс BigInteger
имеет архитектурный предел; см. Есть ли верхняя граница для BigInteger? )