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 ответ:
нет, у вас, кажется, есть законная ошибка. Ошибка присутствует в JDK7, но исправлена в JDK8. Ваши значения правильно представимы как
BigDecimal
s, и должен вести себя правильно, но не надо.трассировка через код
BigDecimal
на линии 2585,this.precision()
1 иthis.scale
- это-2147483647
.this.precision() - this.scale
поэтому переполнения, и следующее переполнение не обрабатывается правильно.эта ошибка исправлено в JDK8 by делать вычитание в
long
арифметика.