Site Overlay

Java中BigDecimal简单及复杂计算(开根、小数次幂、三角函数、π值等)

需求

金融或科学场景下,计算精度要求较高,设计精度要求高的情况一般就会使用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

发表回复

您的电子邮箱地址不会被公开。

A beliving heart is your magic My heart
欢迎来到Diuut的个人博客,这里是我的一些零零碎碎的知识汇总,希望有能帮到你的内容。 | 蜀ICP备2021011635号-1 | Copyright © 2024 Diuut. All Rights Reserved.