Я пробовал BigDecimal.valueOf(Double.POSITIVE_INFINITY)
, но продолжал получать NumberFormatException
Спасибо
Я пробовал BigDecimal.valueOf(Double.POSITIVE_INFINITY)
, но продолжал получать NumberFormatException
Спасибо
Это поведение соответствует документированному, как должен работать метод valueOf
:
Параметры: val - double для преобразования в BigDecimal.
Возвращает: BigDecimal, значение которого равно или приблизительно равно значению val.
Throws: NumberFormatException - если val бесконечно или NaN.
Вы не можете представить бесконечность в BigDecimal
.
Вы не можете просто получить дочерний класс из 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 и неизбежно вызывает довольно много накладных расходов