我想用BigDecimal.pow(int i)
具有很大的基数和指数,但是我得到一个ArithmeticException: Underflow
错误。BigDecimal可能的解决方案下溢错误
就干脆把它的代码是:
BigDecimal base = BigDecimal.valueOf(2147483645.4141948);
BigDecimal product = base.pow(987654321);
System.out.println("product = " + product.toPlainString());
是的,这是一个项目欧拉问题。不过,我知道我的号码是正确的。这不是一个数学问题,它纯粹是我不明白为什么BigDecimal.pow(int i)
给我一个ArithmeticException: Underflow
。
我知道BigDecimal
的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