Java BigDecimal Возможная Ошибка Переполнения


я тестировал граничные условия на каком-то коде с участием BigDecimal, и я заметил, что когда BigDecimal инициализируется строкой "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 78

1 ответ:

нет, у вас, кажется, есть законная ошибка. Ошибка присутствует в JDK7, но исправлена в JDK8. Ваши значения правильно представимы как BigDecimals, и должен вести себя правильно, но не надо.

трассировка через код BigDecimal на линии 2585, this.precision() 1 и this.scale - это -2147483647. this.precision() - this.scale поэтому переполнения, и следующее переполнение не обрабатывается правильно.

эта ошибка исправлено в JDK8 by делать вычитание в long арифметика.