Ошибка Java BigDecimal Возможная ошибка переполнения
Я тестировал граничные условия для некоторого кода с использованием BigDecimal
, и я заметил, что когда a BigDecimal
инициализируется String "1e2147483647"
, он ведет себя неожиданно. Кажется, что оно имеет значение между 0
и 1e-2147483647
. Когда я пытаюсь позвонить intValue()
, я получаю NegativeArraySizeException
. Я должен отметить, что 2147483647
- максимальное значение целого числа в моей системе. Я что-то делаю неправильно, или это проблема с BigDecimal
?
BigDecimal test = new BigDecimal("1e2147483647");
test.compareTo(new BigDecimal(0)); //Returns 1
test.compareTo(new BigDecimal("1e-2147483647")); //Returns -1
test.intValue(); //Throws NegativeArraySizeException
Ответы
Ответ 1
Нет, у вас, похоже, есть законная ошибка. Ошибка присутствует в JDK7, но исправлена в JDK8. Ваши значения правильно представляются как BigDecimal
s и должны вести себя корректно, но не.
Отслеживание через исходного кода BigDecimal
, в строке 2585, this.precision()
равно 1, а this.scale
- -2147483647
. this.precision() - this.scale
поэтому переполняется, и следующее переполнение не обрабатывается правильно.
Эта ошибка была исправлена в JDK8 с помощью выполнения вычитания в long
арифметике.