Как преобразовать Double.POSITIVE_INFINITY в BigDecimal?

Я пробовал BigDecimal.valueOf(Double.POSITIVE_INFINITY), но продолжал получать NumberFormatException

Спасибо

Ответ 1

Это поведение соответствует документированному, как должен работать метод valueOf:

Параметры: val - double для преобразования в BigDecimal.

Возвращает: BigDecimal, значение которого равно или приблизительно равно значению val.

Throws: NumberFormatException - если val бесконечно или NaN.

Ответ 2

Вы не можете представить бесконечность в BigDecimal.

Ответ 3

Вы не можете просто получить дочерний класс из BigDecimal для поддержки NaN и Infinite. При выводе дочернего класса должны быть реализованы конструкторы родителя. И родительский конструктор должен быть вызван первым в дочернем конструкторе. BigDecimal имеет несколько конструкторов, например. BigDecimal (double val). Однако, как указывает JAVA-док, двойной val не должен быть NaN или бесконечным. В противном случае генерируется исключение NumberFormatException. Если вы расширите BigDecimal до MyBigDecimal, я думаю, вам также нужен аналогичный конструктор MyBigDecimal (double val). Проблема в том, что MyBigDecimal (double val) должен вызвать super (val) в качестве первого утверждения (требование Java). Вы не можете добавить что-то вроде if (val == Double.NaN) или попробовать catch перед супер (val). Поэтому функция MyBigDecimal (double val) должна быть такой:

public MyBigDecimal(double val) {
    super(val);
    ...
}

Как таковой не существует способа установить val в Double.NaN или Infinite, потому что это в любом случае приводит к исключению NumberFormatException.

К сожалению, BigDecimal - это класс только для чтения, т.е. у вас нет способа reset его значение с помощью функции, такой как setValue (...). Таким образом, вы никогда не сможете назначить NaN или бесконечно расширенному расширенному классу BigDecimal.

Единственное решение - использовать обертку, т.е.

class MyBigDecimal {
    public BigDecimal mbigDecNormalValue;
    public double mdNaNOrInf;
    ...

ясно, что это будет не очень простая реализация.

Довольно странно, что Oracle не поддерживал BigDecimal NaN или бесконечно в JAVA 7. Но я считаю, что BigDecimal, наконец, поддержит эти значения. Я бы посоветовал не трогать NaN или бесконечно, когда вы используете BigDecimal в данный момент. В противном случае после поддержки NaN и бесконечности пользовательский MyBigDecimal может конфликтовать с новыми интерфейсами BigDecimal и неизбежно вызывает довольно много накладных расходов