Ошибка 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 арифметике.