Non-terminating decimal expansion; no exact representable decimal result.

使用Bigdecimal 做除法

public static void main(String[] args) {
        // 1、不设置保留位数
        System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3)));
        // 2、divide以后再设置保留位数
        System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3)).setScale(2, RoundingMode.HALF_UP));
}

出现报错信息:

Exception in thread "main" java.lang.ArithmeticException: 
Non-terminating decimal expansion; no exact representable decimal result.

异常原因:

 Java 中使用 BigDecimal 做除法运算的时候,值有可能是无限循环的小数;

正确写法:需要在 divide 方法中传递另外两个参数 【scale】、【roundingMode】,来定义小数点后的精确位数

public static void main(String[] args) {
        // 1、不设置保留位数
//        System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3)));
        // 2、divide以后再设置保留位数
//        System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3)).setScale(2, RoundingMode.HALF_UP));
        // 3、正确写法
        System.out.println(BigDecimal.valueOf(2).divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP));
}

舍入模式:

1、ROUND_UP

直接舍去非零的小数位数,对整数位 +1。 

2、ROUND_DOWN

直接舍去小数位数,不对整数位 +1。

3、ROUND_CEILING

如果结果为正数,则舍入行为与 ROUND_UP 相同;如果为负,则舍入行为与 ROUND_DOWN 相同。

4、ROUND_FLOOR

如果结果为正数,则舍入行为与 ROUND_DOWN 相同;如果为负,则舍入行为与 ROUND_UP 相同。

5、ROUND_HALF_UP(四舍五入)

如果舍弃部分 >= 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同。

6、ROUND_HALF_DOWN

如果舍弃部分 > 0.5,则舍入行为与 ROUND_UP 相同;否则舍入行为与 ROUND_DOWN 相同(五舍六入)。

7、ROUND_HALF_EVEN

向“最接近的”数字舍入,如果与两个相邻数字的距离相等,则向相邻的偶数舍入;如果舍弃部分左边的数字为奇数,则舍入行为与 ROUND_HALF_UP 相同;

如果为偶数,则舍入行为与 ROUND_HALF_DOWN 相同。

8、ROUND_UNNECESSARY

断言请求的操作具有精确的结果,因此不需要舍入。不舍位 . 精度位数小于小数位数会抛出异常。

 

posted @ 2024-10-12 10:16  唏嘘-  阅读(21)  评论(0编辑  收藏  举报