關於BigDecimal做除法:Non-terminating decimal expansion; no exact representable。。。
阿新 • • 發佈:2018-11-22
問題
今天在寫一個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 捨棄小數(即截斷)之前增加數字。