我想用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