java.lang.ArithmeticException解决方案

2024-01-10 19:05:04 浏览数 (2)

java.lang.ArithmeticException: Non-terminating decimal expansion; no exact representable decimal result这个异常意思是算术运算结果为一个无限小数,无法准确表示为确定的十进制数字。

这通常出现在以下几种情况:

1. 十进制除法的结果是一个循环小数,比如1/3。

2. 开根运算的结果是一个无理数,比如开二。

3. 其他一些数字运算结果无法精确表示为有限长度的十进制数字。

代码语言:java复制
import java.math.BigDecimal;

public class Demo {

    public static void main(String[] args) {
        // 参数为两个可能产生循环小数的数字       
        BigDecimal a = new BigDecimal("1");
        BigDecimal b = new BigDecimal("3");
        
        try {
            // 使用BigDecimal运算
            BigDecimal result = a.divide(b);
            System.out.println(result); 
        } catch (ArithmeticException e) {
            e.printStackTrace();
        }
    }
}

解决这个异常的一些方法:

1. 使用BigDecimal来表示浮点数,避免精度损失问题。

2. 取出有效小数点后几位即可,比如1/3取3为0.333333。

3. 使用近似值来替代无理数,比如开二取1.41421356237309504880。

4. 把精度要求降低,只判断结果是否接近预期值即可。

5. 使用其他进制系统如八进制来表示,改变进制可能可以精确表示。

6. 把计算过程改为整数处理,避免出现无理数情况。

7. 直接捕获异常,忽略精度问题继续后续流程。

代码语言:java复制
public class Demo {

    public static void main(String[] args) {
        double result = Math.sqrt(2);
        try {
            System.out.println(result);
        } catch (ArithmeticException e) {
            // 取近似值处理
            result = 1.4142135623730950488016887;  
            System.out.println(result);
        }
    }
}

一般来说,通过BigDecimal或舍入有效位来处理小数,以及选择使用近似值,是很好的解决此异常的常用方法。

代码语言:java复制
import java.math.BigDecimal;

public class BigDecimalExample {

  public static void main(String[] args) {
    
    // 定义可能产生循环小数的值,使用BigDecimal包装
    BigDecimal a = new BigDecimal("1");
    BigDecimal b = new BigDecimal("3");

    try {
      // 使用BigDecimal的divide方法进行除法运算
      BigDecimal result = a.divide(b, 2, BigDecimal.ROUND_HALF_UP);  

      System.out.println("运算结果为: "   result);

    } catch (ArithmeticException e) {
      e.printStackTrace();
    }
  }
}

0 人点赞