概述
BigDecimal是Java提供的一个类,用于处理精确的浮点数运算,特别适用于金融、科学计算等需要高精度的小数计算的场景。它属于java.math包下,并提供了比基本数据类型float和double更高的精度,避免了由于浮点数运算精度限制而产生的误差。
构造器
序号 | 构造器 | 作用 |
1 | BigDecimal(String val) | 通过字符串参数来创建 BigDecimal 对象。这是最常用的构造方法,能够精确地表示数字。 |
2 | BigDecimal(double val) | 通过 double 类型的值创建 BigDecimal 对象。 |
3 | BigDecimal(long val) | 通过 long 类型的整数值创建 BigDecimal 对象。适用于整数。 |
4 | BigDecimal(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