BigDecimal除法运算抛出java.lang.ArithmeticException异常

Thu Oct 29 20:28:23 CST 2015 1335 Java

文章摘要使用Java的BigDecimal的divide方法做除法时抛出异常java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result

Java开发中,通常在计算金额的时候,需要用到BigDecimal类来进行运算。

在使用除法运算divide方法的时候,不少人都遇到这样一个异常:java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result


这是由于除法不整除,运算结果出现无限循环小数导致的。



解决办法是指定要保留的小数位。

BigDecimal ten = new BigDecimal("10");
BigDecimal three = new BigDecimal("3");

//第二个参数为保留的小数位,第三个参数为舍入模式
//HALF_UP表示向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入,相当于四舍五入
BigDecimal result = ten.divide(three, 3, RoundingMode.HALF_UP);



可以有多种舍入模式,如下:

  • CEILING 
     向正无限大方向舍入的舍入模式
    DOWN
    向零方向舍入的舍入模式
    DOWN        
    向零方向舍入的舍入模式
    FLOOR
    向负无限大方向舍入的舍入模式
    HALF_DOWN
    向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向下舍入
    HALF_EVEN 
    向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向相邻的偶数舍入
    HALF_UP
    向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入
    UNNECESSARY 
    用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入
    UP 
    远离零方向舍入的舍入模式




打赏
打赏

分享到: