JAVA-BigDecimal类

概述

BigDecimal是Java提供的一个类,用于处理精确的浮点数运算,特别适用于金融、科学计算等需要高精度的小数计算的场景。它属于java.math包下,并提供了比基本数据类型float和double更高的精度,避免了由于浮点数运算精度限制而产生的误差。

构造器

序号构造器作用
1BigDecimal(String val)通过字符串参数来创建 BigDecimal 对象。这是最常用的构造方法,能够精确地表示数字。
2BigDecimal(double val)通过 double 类型的值创建 BigDecimal 对象。
3BigDecimal(long val)通过 long 类型的整数值创建 BigDecimal 对象。适用于整数。
4BigDecimal(BigInteger unscaledVal, int scale)通过 BigInteger 和一个缩放因子(小数位数)创建 BigDecimal 对象。

参数: scale:表示 BigDecimal 的小数点位置。scale 为正时表示有小数位,负时表示有整数位。

eg: 

BigInteger bigInt = new BigInteger("12345");
BigDecimal num = new BigDecimal(bigInt, 2); // 123.45

注意: 由于 double 类型本身存在精度问题,建议尽量避免直接从 double 构造 BigDecimal。

常用方法

scale()

表示小数位数

        BigDecimal bigDecimal = new BigDecimal("123.456");
        int scale = bigDecimal.scale();
        System.out.println(scale); //3

setScale()

可以对一个 Bigpecimal设置它的 scale,如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断:

        BigDecimal b1 = new BigDecimal("123.456789");
        BigDecimal b2 = b1.setScale(4, RoundingMode.HALF_UP);// 四舍五入  123.4568
        BigDecimal b3 = b1.setScale(4, RoundingMode.DOWN);// 直接截断  123.4567
        System.out.println(b2);
        System.out.println(b3);

stripTrailingZeros()

通过BigDecimal的stripTrailingzeros()方法,可以将一个 Bigpecimal 格式化为一个相等的,但去掉了末尾0的BigDecimal

        BigDecimal bigDecimal = new BigDecimal("123.4560700");
        BigDecimal bigDecimal1 = bigDecimal.stripTrailingZeros();
        System.out.println(bigDecimal1); // 123.45607

add()

对两个BigDecimal对象做加法

        BigDecimal b1 = new BigDecimal("11.1");
        BigDecimal b2 = new BigDecimal("1.1");
        BigDecimal b3 = b1.add(b2);
        System.out.println(b3); //12.2

subtract()

对两个BigDecimal对象做减法

        BigDecimal b1 = new BigDecimal("11.1");
        BigDecimal b2 = new BigDecimal("1.1");
        BigDecimal b3 = b1.subtract(b2);
        System.out.println(b3); //10.0

multiply()

对两个BigDecimal对象做乘法

        BigDecimal b1 = new BigDecimal("11.1");
        BigDecimal b2 = new BigDecimal("1.1");
        BigDecimal b3 = b1.multiply(b2);
        System.out.println(b3); //12.21

divide()

对当前的 BigDecimal 对象与另一个 BigDecimal 对象进行除法运算。如果不能整除,将抛出 ArithmeticException

        BigDecimal b1 = new BigDecimal("11.1");
        BigDecimal b2 = new BigDecimal("2");
        BigDecimal b3 = b1.divide(b2);
        System.out.println(b3); //5.55

所以就需要指定精度或取舍模式

divide(BigDecimal divisor, int scale, int roundingMode)

  • divisor - 被除数(需要除的 BigDecimal 对象)
  • scale - 结果的小数位数。
  • roundingMode - 舍入模式,通常使用 RoundingMode 枚举中的值(例如: RoundingMode.HALF_UP)。
        BigDecimal b1 = new BigDecimal("11.1");
        BigDecimal b2 = new BigDecimal("1.1");
        BigDecimal b3 = b1.divide(b2,3,RoundingMode.DOWN);//保留3位小数,直接截断
        System.out.println(b3); //10.090

remainder()

返回当前 BigDecimal 对象除以另一个 BigDecimal 对象后的余数。

BigDecimal num1 = new BigDecimal("10.5");
BigDecimal num2 = new BigDecimal("3");
BigDecimal result = num1.remainder(num2);  // 1.5

compareTo()

比较两个BigDecimal的大小

在比较两个 BigDecimal 的值是否相等时,要特别注意,使用 equals()方法不但要求两个Bigpecimal 的值相等还要求它们的 scale()相等:

        BigDecimal b1 = new BigDecimal("11.11");
        BigDecimal b2 = new BigDecimal("11.1100");
        System.out.println(b1.equals(b2)); //false

所以必须使用 compareTo()方法来比较,它根据两个值的大小分别返回负数、正数和 0,分别表示小于、大于和等

        BigDecimal b1 = new BigDecimal("11.11");
        BigDecimal b2 = new BigDecimal("11.1100");
        BigDecimal b3 = new BigDecimal("1.11");
        System.out.println(b1.compareTo(b2)); //0
        System.out.println(b1.compareTo(b3)); //1
        System.out.println(b3.compareTo(b1)); //-1

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值