1. 程式人生 > >關於java中的BigDecimal型別,新手常見問題彙總

關於java中的BigDecimal型別,新手常見問題彙總

首先BigDecimal是一個不可變型別,什麼是不可變型別呢?

當一個普通類 (class) 的例項不能被修改時,我們便稱之為「不可變類」(immutable class)。這樣的類在例項化時便需要提供其所有的值,而在之後的執行中便絕不可更改。比如大家可能都知道的 Java 中已有的一些不可變型別,String (string 的字串聯很沒效率,對吧), BigInteger, 和 BigDecimal。

因此基於上面這種規則,我們來分析下面這段程式碼:

BigDecimal amount = new BigDecimal(0);
amount.add(new BigDecimal(100
)); amount.add(new BigDecimal(100)); amount.add(new BigDecimal(100));

此時amount的值是多少呢?是不是像脫口而出說300?錯!amount的值是0!

因為BigDecimal是不可變型別,所以直接add並不能加數值累加到amount上,正確的寫法應該是下面這樣:

BigDecimal amount = new BigDecimal(0);
amount = amount.add(new BigDecimal(100));
amount = amount.add(new BigDecimal(100));
amount = amount.add(new
BigDecimal(100));

此時amount的值才是300。

第二個問題,是在做BigDecimal的除法運算時,有時你可能發現有如下錯誤:

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

別慌,做除法運算時出現這種情況很正常,這是因為通過BigDecimal的divide方法進行除法時,當不整除,出現無限迴圈小數時,就會丟擲該異常。

下面說說解決辦法,既然出現了無限迴圈小數,那麼就適當的四捨五入咯。

解決的辦法就是給divide方法設定精確的小數點,如:divide(xxxxx,2),這樣就可以精確到小數點後兩位,重新執行程式,你就會發現不會再報錯了。