2012-07-28 51 views
1

以下將兩個BegDecimal數字相除的方法可以正常工作。Java中的某些BigDecimal數字在分割時會導致拋出ArithmeticException

BigDecimal a=new BigDecimal(5); 
BigDecimal b=new BigDecimal(2); 
System.out.println(a.divide(b)); 

輸出:2.5


下同樣的方法但未能與java.lang.ArithmeticException

BigDecimal c=new BigDecimal(361); 
BigDecimal d=new BigDecimal(6); 
System.out.println(c.divide(d)); 

下面是完整的異常堆棧跟蹤。

Exception in thread "main" java.lang.ArithmeticException: 
Non-terminating decimal expansion; no exact representable decimal result. 
    at java.math.BigDecimal.divide(BigDecimal.java:1603) 
    at currenttime.Main.main(Main.java:15) 
Java Result: 1 

什麼是解決方案?

+1

您需要設置一個舍入模式。否則,它默認爲「確切」。 – Mysticial 2012-07-28 23:16:32

+2

更多信息:http://jaydeepm.wordpress.com/2009/06/04/bigdecimal-and-non-terminating-decimal-expansion-error/ – Mysticial 2012-07-28 23:17:21

回答

1

的一個參數BigDecimal.Divide拋出ArithmeticException如果商是一個非終止十進制(六分之三百六十一是60.1666666 ...):

拋出:
ArithmeticException - 如果準確的商不沒有 端接十進制擴展

爲了避免這種使用overload與第二RoundingMode參數。

也就是說,你告訴BigDecimal究竟你對分割結果有什麼期望。

2

這與Java規範的預期一致。你沒有提供任何比例,並且自361/6 = 60.1(6)它應該拋出該異常。如果你想要一些舍入,你應該提供一個尺度,這意味着小數點後面有多少數字要返回,或者你可能想用devideAndReminder來提醒。

2

你可以,說輪5位小數:

BigDecimal c=new BigDecimal(361); 
BigDecimal d=new BigDecimal(6); 
System.out.println(c.divide(d, 5, BigDecimal.ROUND_HALF_EVEN)); 
相關問題