1. 程式人生 > >關於BigDecimal做除法:Non-terminating decimal expansion; no exact representable。。。

關於BigDecimal做除法:Non-terminating decimal expansion; no exact representable。。。

問題

今天在寫一個JAVA程式的時候出現了異常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result大概的意思是“無法結束的除法表示式;沒有精確的除結果”。

發現報錯的語句是:

BigDecimal averageAmount =amountSum.divide(count);

原來JAVA中如果用BigDecimal做除法的時候一定要在divide方法中傳遞第二個引數,定義精確到小數點後幾位,否則在不整除的情況下,結果是無限迴圈小數時,就會丟擲以上異常。

正確的格式是下面這樣子的:

BigDecimal averageAmount = amountSum.divide(count,2,ROUND_HALF_DOWN);

解析

devide的函式定義如下:

BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;

scale為小數位數;

roundingMode為小數模式,有以下幾種模式:

ROUND_CEILING
如果 BigDecimal 是正的,則做 ROUND_UP 操作;如果為負,則做 ROUND_DOWN 操作。

ROUND_DOWN
從不在捨棄(即截斷)的小數之前增加數字。
ROUND_FLOOR
如果 BigDecimal 為正,則作 ROUND_UP ;如果為負,則作 ROUND_DOWN 。
ROUND_HALF_DOWN
若捨棄部分> .5,則作 ROUND_UP;否則,作 ROUND_DOWN 。
ROUND_HALF_EVEN
如果捨棄部分左邊的數字為奇數,則作 ROUND_HALF_UP ;如果它為偶數,則作 ROUND_HALF_DOWN 。
ROUND_HALF_UP
若捨棄部分>=.5,則作 ROUND_UP ;否則,作 ROUND_DOWN 。

ROUND_UNNECESSARY
該“偽舍入模式”實際是指明所要求的操作必須是精確的,,因此不需要舍入操作。
ROUND_UP
總是在非 0 捨棄小數(即截斷)之前增加數字。