Java BigDecimal 类的创建对象方法以及常用的加减乘除、设置精度方法

时间:2025-04-01 07:45:37
一、BigDecimal 类简介

  因为计算机无法精确表示浮点数,所以在进行数字运算时,如果有 double 或 float 类型的浮点数参与计算,容易出现计算不准确的情况。在一些对精度要求很高的系统中,需要使用 BigDecimal 类来进行精确运行。

二、创建 BigDecimal 对象的方式
2.1 使用构造方法创建对象

  使用构造器方法创建对象,有多种不同的入参,常见的方法如下:

  • BigDecimal(String val)
  • BigDecimal(double val) (备注:不推荐,容易丢精度)
2.2 使用静态方法创建对象

  BigDecimal 有多种静态方法可以创建对象,常见的几种方法如下所示:

  • public static BigDecimal valueOf(double val)
  • public static BigDecimal valueOf(long val)
  • public static BigDecimal valueOf(long unscaledVal, int scale)

  以上几种创建 BigDecimal 的 demo 如下所示。

	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("123.092");
        System.out.println(num1);
        // 123.092

        // 不推荐此种方法
        BigDecimal num2 = new BigDecimal(123.092);
        System.out.println(num2);
        // 123.0919999999999987494447850622236728668212890625

        BigDecimal num3 = BigDecimal.valueOf(1234.5678);
        System.out.println(num3);
        // 1234.5678

        long num4 = 1234;
        BigDecimal num5 = BigDecimal.valueOf(num4);
        System.out.println(num5);
        // 1234

        BigDecimal num6 = BigDecimal.valueOf(num4, 3);
        System.out.println(num6);
        // 1.234
    }
三、BigDecimal 类的常用方法

  BigDecimal 几种常见计算方法如下所示。

操作方法 函数
加法 public BigDecimal add(BigDecimal augend)
减法 public BigDecimal subtract(BigDecimal subtrahend)
乘法 public BigDecimal multiply(BigDecimal multiplicand)
除法(限定能除尽的情况,如果除不尽会抛出异常) public BigDecimal divide(BigDecimal divisor)
除法(可设置相除结果保留精度,无论是否可以除尽,都可以用该方法设置精度) public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
求余 public BigDecimal remainder(BigDecimal divisor)
求相反数 public BigDecimal negate()

  以上几种操作方法的 demo 如下所示。

	public static void main(String[] args) {
        BigDecimal bignum1 = new BigDecimal("10");
        BigDecimal bignum2 = new BigDecimal("2");
        BigDecimal bignum3;

        // 加法
        bignum3 = bignum1.add(bignum2);
        System.out.println("和是:" + bignum3);
        // 和是:12

        // 减法
        bignum3 = bignum1.subtract(bignum2);
        System.out.println("差是:" + bignum3);
        // 差是:8

        // 乘法
        bignum3 = bignum1.multiply(bignum2);
        System.out.println("积是:" + bignum3);
        // 积是:20

        // 除法(可除尽时)
        bignum3 = bignum1.divide(bignum2);
        System.out.println("商是:" + bignum3);
        // 商是:5

        // 除法(设置精度及舍入模式)
        BigDecimal a = new BigDecimal("10");
        BigDecimal b = new BigDecimal("3");
        BigDecimal c = a.divide(b, 3, RoundingMode.HALF_UP);
        System.out.println("商是:" + c);
        // 商是:3.333

        // 求余数
        BigDecimal d = new BigDecimal("5");
        BigDecimal e = new BigDecimal("3");
        System.out.println(d.remainder(e));
        // 2

        // 求余数
        BigDecimal f = new BigDecimal("5.5");
        BigDecimal g = new BigDecimal("3.1");
        System.out.println(f.remainder(g));
        // 2.4

        // 求相反数
        BigDecimal h = new BigDecimal("-5.4");
        BigDecimal i = h.negate();
        System.out.println(i);
        // 5.4
    }
四、设置精度(保留小数位)

  BigDecimal 有多种方法可以设置精度(即设置几位小数)。分述如下。

4.1 DecimalFormat 设置格式

  可以通过 DecimalFormat 设置保留的格式,demo 如下所示。如何编写 DecimalFormat,可以参考网上的介绍,此处不做介绍。

    public static void main(String[] args) {
        // 格式化两位有效数字(四舍五入)
        DecimalFormat df = new DecimalFormat("0.00");
        double num1 = 0.145926;
        System.out.println(df.format(num1));
        // 0.15
    }
4.2 BigDecimal setScale(int newScale) 方法设置精度

  可以调用 BigDecimal 的 setScale(int newScale) 方法来设置精度,其中传入参数即保留的小数位数。该方法要求请求的操作具有精确的结果,否则会抛出 ArithmeticException。

	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1234");
        BigDecimal num2 = num1.setScale(1);
        System.out.println(num2);
        // 1234.0

        BigDecimal num3 = new BigDecimal("1234.45");
        BigDecimal num4 = num3.setScale(1);
        System.out.println(num4);
        // 此处抛出异常:: Rounding necessary
    }
4.3 调用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法

  通过调用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法,传入保留的小数位数 newScale 以及舍入模式 roundingMode(Java BigDecimal 的舍入模式(RoundingMode)详解),可以实现精度设置,demo 如下所示。

public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1234.455");
        BigDecimal num2 = num1.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(num2);
        // 1234.46
        System.out.println(num2.doubleValue());
        // 1234.46
    }
五、常用乘除法(设置精度)
5.1 乘法
	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1.45");
        BigDecimal num2 = new BigDecimal("2.625");
        BigDecimal ans = num1.multiply(num2).setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(ans);
        // 3.81
        System.out.println(ans.doubleValue());
        // 3.81
        System.out.println(ans.intValue());
        // 3
    }
5.2 除法
	public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("10.45");
        BigDecimal num2 = new BigDecimal("2.625");
        BigDecimal ans = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
        System.out.println(ans);
        // 3.98
        System.out.println(ans.doubleValue());
        // 3.98
        System.out.println(ans.intValue());
        // 3
    }

相关文章