需求 金融或科学场景下,计算精度要求较高,设计精度要求高的情况一般就会使用BigDecimal类型,此处将常用的以及可能会用到的计算类型列举下。
简单运算
PS:对象初始化时使用double类型数据进行构造会导致数据失真,因此不建议使用,如需要使用小数类型,推荐使用String进行构造。
加法:使用 add 方法进行两个 BigDecimal 对象的相加
代码语言:javascript复制BigDecimal result = BigDecimal.ZERO.add(BigDecimal.ONE);
//result=10;
减法:使用 subtract
方法进行两个 BigDecimal 对象的相减
代码语言:javascript复制BigDecimal result = BigDecimal.TEN.subtract(BigDecimal.ONE);
//result=9;
乘法:使用 multiply
方法进行两个 BigDecimal 对象的相乘
代码语言:javascript复制BigDecimal result = new BigDecimal("10").multiply( new BigDecimal("3"));
//result=30;
除法:使用 divide
方法进行两个 BigDecimal 对象的相除,参数中可以指定多种取余方式
代码语言:javascript复制BigDecimal result = BigDecimal.TEN.divide(BigDecimal.valueOf(3), 2, RoundingMode.HALF_UP);
//result=3.33;
取余:使用 remainder
方法获取两个 BigDecimal 对象的余数
代码语言:javascript复制BigDecimal result = BigDecimal.TEN.remainder(BigDecimal.valueOf(4));
//result=2;
幂运算:使用 pow
方法计算 BigDecimal 对象的幂
代码语言:javascript复制BigDecimal result = BigDecimal.valueOf(3).pow(3);
//result=27;
比较运算:使用 compare 方法获得比较结果
代码语言:javascript复制
复杂运算
以上是常用的运算,但是如果设计复杂度开根或者小数次幂的话,自带的方法就不满足了,因此,需要引入其他的BigDecimal运算类(big-math),引入以下依赖:
代码语言:javascript复制<!-- 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 对象的开根过后结果
代码语言:javascript复制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次幂,支持小数)
代码语言:javascript复制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 对象的对数运算结果
代码语言:javascript复制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为底的指数函数运算结果
代码语言:javascript复制BigDecimal num1 = new BigDecimal("2");
BigDecimal result1 = BigDecimalMath.exp(num1, new MathContext(6));
System.out.println("result1=" result1);
//result1=7.38906
三角函数运算:使用多种方法获取BigDecimal 对象的三角函数运算结果
代码语言:javascript复制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 对象的反三角函数运算结果
代码语言:javascript复制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 对象的双反曲函数运算结果
代码语言:javascript复制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 对象的阶乘运算结果
代码语言:javascript复制BigDecimal num1 = new BigDecimal("5");
BigDecimal result1 = BigDecimalMath.factorial(num1, new MathContext(6));
System.out.println("result1=" result1);
//result1=120
获取指定精度π
代码语言:javascript复制BigDecimal result1 = BigDecimalMath.pi(new MathContext(20));
System.out.println("result1=" result1);
//result1=3.1415926535897932385
获取指定精度e
代码语言:javascript复制BigDecimal result1 = BigDecimalMath.e(new MathContext(20));
System.out.println("result1=" result1);
//result1=2.7182818284590452354
指数运算:使用exponent方法获取BigDecimal 对象的指数运算结果
代码语言:javascript复制int result1 = BigDecimalMath.exponent(BigDecimal.valueOf(1.456E99));
System.out.println("result1=" result1);
//result1=99
取小数函数:使用fractionalPart方法获取BigDecimal 对象的小数部分
代码语言:javascript复制BigDecimal num1 = new BigDecimal("123.456");
BigDecimal result1 = BigDecimalMath.fractionalPart(num1);
System.out.println("result1=" result1);
//result1=0.456
以上是大部分该方法中设计的函数类型, 通过组合能够计算大部分复杂场景的公式。
转载请署名(Diuut)
Post Views: 2