一:解决问题

        BigDecimal b1=new BigDecimal(1);
        BigDecimal b2=new BigDecimal(3);
        BigDecimal b3=b1.divide(b2);

 报错:

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

 BigDecimal 用于高精度的数学计算,这个异常翻译

java.lang.AthmeticException:非终止小数展开;没有可精确表示的十进制结果。

 意思就是这个除法除不尽,会得到一个无限小数,导致异常。

解决办法:

       BigDecimal b3=b1.divide(b2,2, RoundingMode.HALF_UP);

2表示保留2位小数
RoundingMode.HALF_UP 表示四舍五入。

 二.BigDecimal中divide方法

首先说一下用法,BigDecimal中的divide主要就是用来做除法的运算。其中有这么一个方法.

public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)

第一个参数是除数,第二个参数代表精度,保留几位小数,第三个代表的是使用的模式(RoundingMode是一个枚举)

第三个参数RoundingMode枚举说明

RoundingMode.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2

RoundingMode.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3

RoundingMode.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4

RoundingMode.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3

后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位。
 

BigDecimal.setScale()方法用于格式化小数点

setScale(1)表示保留一位小数,默认用四舍五入方式 
setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
 

Logo

一站式 AI 云服务平台

更多推荐