出现Rounding necessary错误原因是使用了 BigDecimal 的 setScale 方法导致。
错误原因:setScale方法保留小数位数小于实际位数并且未指定roundingMode参数即报错。如下代码:
BigDecimal rs = new BigDecimal("2057.9200");
rs.setScale(2);
上述代码实际数值是2057.9200是4位小数,而使用setScale方法保留2位小数时会报错。
解决方法:
【一、指定setScale的第二个参数roundingMode(推荐)】
如下所示:
BigDecimal rs = new BigDecimal("2057.9200");
rs.setScale(2, RoundingMode.HALF_UP);
setScale的第二个参数为roundingMode,此值是一个常量,具体取值及含义可通过JDK文档查得
RoundingMode枚举定义了多种舍入模式,例如:
RoundingMode.UP:远离零方向舍入。
RoundingMode.DOWN:向零方向舍入。
RoundingMode.CEILING:向正无穷方向舍入。
RoundingMode.FLOOR:向负无穷方向舍入。
RoundingMode.HALF_UP:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向上舍入的舍入模式。
RoundingMode.HALF_DOWN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则为向下舍入的舍入模式。
RoundingMode.HALF_EVEN:向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入。
RoundingMode.UNNECESSARY:断言请求的操作具有精确的结果,因此不需要舍入
【二、保留小数位数大于/等于实际小数位数】
BigDecimal rs = new BigDecimal("2057.9200");
rs.setScale(5);
保证保留的小数位数大于等于实际小数位数也可以,但很多时候我们不知道实际小数位数是多少,所以建议使用第一种方式解决。
标签:舍入,Java,BigDecimal,rs,Rounding,setScale,小数位,RoundingMode From: https://www.cnblogs.com/xiaop27/p/18354956