Я пытаюсь использовать BigDecimal.pow(int i)
с очень большой базой и экспонентами, однако я получаю ошибку ArithmeticException: Underflow
.Возможные решения ошибки BigDecimal underflow
Чтобы просто поставить его, код:
BigDecimal base = BigDecimal.valueOf(2147483645.4141948);
BigDecimal product = base.pow(987654321);
System.out.println("product = " + product.toPlainString());
Да, это проблема проекта Эйлера. Однако я знаю, что мои цифры верны. Это не математическая проблема, я просто не понимаю, почему BigDecimal.pow(int i)
дает мне ArithmeticException: Underflow
.
Я знаю, что 's scale
is a 32-bit int
, но есть ли вообще способ обойти это и рассчитать такое большое значение? Если это помогает, я планирую настил продукта и модификацию его на 100000000
, так как мне нужны только последние 8 цифр. Если есть какой-либо другой способ, я мог бы сделать это математически, мне бы хотелось намекнуть.
Стек след:
Exception in thread "main" java.lang.ArithmeticException: Underflow
at java.math.BigDecimal.checkScale(BigDecimal.java:3841)
at java.math.BigDecimal.pow(BigDecimal.java:2013)
at test.main(test.java:10)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:498)
at com.intellij.rt.execution.application.AppMain.main(AppMain.java:147)
Process finished with exit code 1
Спасибо.
' BigDecimal.valueOf (2147483645.4141948) '- нет! Никогда не создавайте BigDecimal из литерала с плавающей запятой; вы уже сталкиваетесь с ошибкой округления, просто делая это. Создайте его из строкового литерала: 'new BigDecimal (" 2147483645.4141948 ")'. – user2357112
@ user2357112 'BigDecimal.valueOf()' принимает 'long l' как свой аргумент, а не строковый литерал. – kkmonlee
Упс, исправлено. Вам нужен конструктор, а не valueOf. – user2357112