需求
金融或科学场景下,计算精度要求较高,设计精度要求高的情况一般就会使用BigDecimal类型,此处将常用的以及可能会用到的计算类型列举下。
目录
简单运算
PS:对象初始化时使用double类型数据进行构造会导致数据失真,因此不建议使用,如需要使用小数类型,推荐使用String进行构造。
加法
使用 add 方法进行两个 BigDecimal 对象的相加
BigDecimal result = BigDecimal.ZERO.add(BigDecimal.ONE);
//result=10;
减法
使用 subtract
方法进行两个 BigDecimal 对象的相减
BigDecimal result = BigDecimal.TEN.subtract(BigDecimal.ONE);
//result=9;
乘法
使用 multiply
方法进行两个 BigDecimal 对象的相乘
BigDecimal result = new BigDecimal("10").multiply( new BigDecimal("3"));
//result=30;
除法
使用 divide
方法进行两个 BigDecimal 对象的相除,参数中可以指定多种取余方式
BigDecimal result = BigDecimal.TEN.divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP);
//result=3.33;
取余
使用 remainder
方法获取两个 BigDecimal 对象的余数
BigDecimal result = BigDecimal.TEN.remainder(BigDecimal.valueOf(4));
//result=2;
幂运算
使用 pow
方法计算 BigDecimal 对象的幂
BigDecimal result = BigDecimal.valueOf(3).pow(3);
//result=27;
比较运算
使用 compare 方法获得比较结果
BigDecimal num1 = new BigDecimal("1");
BigDecimal num2 = new BigDecimal("2");
BigDecimal num3 = new BigDecimal("2");
int result1 = num1.compareTo(num2);
System.out.println("result1=" + result1);
int result2 = num2.compareTo(num1);
System.out.println("result2=" + result2);
int result3 = num2.compareTo(num3);
System.out.println("result3=" + result3);
//result1=-1
//result2=1
//result3=0
复杂运算
以上是常用的运算,但是如果设计复杂度开根或者小数次幂的话,自带的方法就不满足了,因此,需要引入其他的BigDecimal运算类(big-math),引入以下依赖:
<!-- https://mvnrepository.com/artifact/ch.obermuhlner/big-math -->
<dependency>
<groupId>ch.obermuhlner</groupId>
<artifactId>big-math</artifactId>
<version>2.3.0</version>
</dependency>
参数中需要指定精度的话使用MathContext来指定。
开根运算
使用 sqrt 获取BigDecimal 对象的开根过后结果
BigDecimal num1 = new BigDecimal("2");
BigDecimal result = BigDecimalMath.sqrt(num1, new MathContext(6));
System.out.println("result="+result);
// result=1.41421
幂运算
使用 pow
方法计算 BigDecimal 对象的幂(计算x的y次幂,支持小数)
BigDecimal num1 = new BigDecimal("2");
BigDecimal num2 = new BigDecimal("1.5");
BigDecimal result1 = BigDecimalMath.pow(num1, num2, new MathContext(6));
System.out.println("result1=" + result1);
BigDecimal num3 = new BigDecimal("-1.5");
BigDecimal result2 = BigDecimalMath.pow(num1, num3, new MathContext(6));
System.out.println("result2=" + result2);
//result1=2.82843
//result2=0.353553
对数运算
使用 log 的多种方法获取BigDecimal 对象的对数运算结果
BigDecimal num1 = new BigDecimal("2");
BigDecimal result1 = BigDecimalMath.log(num1, new MathContext(6));
System.out.println("result1="+result1);
BigDecimal result2 = BigDecimalMath.log2(num1, new MathContext(6));
System.out.println("result2="+result2);
BigDecimal result3 = BigDecimalMath.log10(num1, new MathContext(6));
System.out.println("result3="+result3);
//result1=0.693147
//result2=1
//result3=0.301030
以自然常数e为底的指数函数运算
使用 exp 获取BigDecimal 对象的以e为底的指数函数运算结果
BigDecimal num1 = new BigDecimal("2");
BigDecimal result1 = BigDecimalMath.exp(num1, new MathContext(6));
System.out.println("result1="+result1);
//result1=7.38906
三角函数运算
使用多种方法获取BigDecimal 对象的三角函数运算结果
BigDecimal num1 = new BigDecimal("10");
BigDecimal result1 = BigDecimalMath.sin(num1, new MathContext(6));
System.out.println("result1="+result1);
BigDecimal result2 = BigDecimalMath.cos(num1, new MathContext(6));
System.out.println("result2="+result2);
BigDecimal result3 = BigDecimalMath.tan(num1, new MathContext(6));
System.out.println("result3="+result3);
BigDecimal result4 = BigDecimalMath.cot(num1, new MathContext(6));
System.out.println("result4="+result4);
//result1=-0.544021
//result2=-0.839072
//result3=0.648361
//result4=1.54235
反三角函数运算
使用多种方法获取BigDecimal 对象的反三角函数运算结果
BigDecimal num1 = new BigDecimal("0.5");
BigDecimal result1 = BigDecimalMath.asin(num1, new MathContext(6));
System.out.println("result1="+result1);
BigDecimal result2 = BigDecimalMath.acos(num1, new MathContext(6));
System.out.println("result2="+result2);
BigDecimal result3 = BigDecimalMath.atan(num1, new MathContext(6));
System.out.println("result3="+result3);
BigDecimal result4 = BigDecimalMath.acot(num1, new MathContext(6));
System.out.println("result4="+result4);
//result1=0.523599
//result2=1.04720
//result3=0.463648
//result4=1.10715
反双曲函数运算
使用多种方法获取BigDecimal 对象的双反曲函数运算结果
BigDecimal num1 = new BigDecimal("2");
BigDecimal result1 = BigDecimalMath.asinh(num1, new MathContext(6));
System.out.println("result1="+result1);
BigDecimal result2 = BigDecimalMath.acosh(num1, new MathContext(6));
System.out.println("result2="+result2);
BigDecimal num2 = new BigDecimal("0.5");
BigDecimal result3 = BigDecimalMath.atanh(num2, new MathContext(6));
System.out.println("result3="+result3);
BigDecimal num3 = new BigDecimal("-2");
BigDecimal result4 = BigDecimalMath.acoth(num3, new MathContext(6));
System.out.println("result4="+result4);
//result1=1.44364
//result2=1.31696
//result3=0.549306
//result4=-0.549306
阶乘运算
使用 factorial 方法获取BigDecimal 对象的阶乘运算结果
BigDecimal num1 = new BigDecimal("5");
BigDecimal result1 = BigDecimalMath.factorial(num1, new MathContext(6));
System.out.println("result1=" + result1);
//result1=120
获取指定精度π
BigDecimal result1 = BigDecimalMath.pi(new MathContext(20));
System.out.println("result1=" + result1);
//result1=3.1415926535897932385
获取指定精度e
BigDecimal result1 = BigDecimalMath.e(new MathContext(20));
System.out.println("result1=" + result1);
//result1=2.7182818284590452354
指数运算
使用 exponent 方法获取BigDecimal 对象的指数运算结果
int result1 = BigDecimalMath.exponent(BigDecimal.valueOf(1.456E99));
System.out.println("result1=" + result1);
//result1=99
取小数函数
使用 fractionalPart 方法获取BigDecimal 对象的小数部分
BigDecimal num1 = new BigDecimal("123.456");
BigDecimal result1 = BigDecimalMath.fractionalPart(num1);
System.out.println("result1=" + result1);
//result1=0.456
以上是该工具类中涉及的大部分方法, 通过组合能够计算大部分复杂场景的公式。
转载请署名(Diuut)