本文简单介绍了BigDecimal的一些常见用法。
文章目录
- 前言
- 一、BigDecimal是什么?
- 二、基础方法
- 1.构造方法
- 2.常见方法
- 总结
前言
最近项目中有很多涉及到数值计算的数据,采用了BigDecimal用以对数据进行更精确的计算。
一、BigDecimal是什么?
BigDecimal是java在java.math中提供的API类BigDecimal,用来对超过16位有效位的数进行精确的运算。
二、基础方法
1.构造方法
BigDecimal提供了六个构造方法:
BigDecimal(BigInteger val) 创建一个具有参数所指定大整数类型的对象。
BigDecimal(char[] in) 创建一个具有参数所指定字符数组的对象。
BigDecimal(double val) 创建一个具有参数所指定双精度值的对象(不推荐)。
BigDecimal(int val) 创建一个具有参数所指定整数值的对象。
BigDecimal(long val) 创建一个具有参数所指定长整数值的对象。
BigDecimal(String val) 创建一个具有参数所指定以字符串表示的数值的对象。
public static void main(String[] args){
char[] in = {'1','3'};
BigDecimal a = new BigDecimal(new BigInteger(String.valueOf(10000000)));
BigDecimal b = new BigDecimal(in);
BigDecimal c = new BigDecimal(2.33);
BigDecimal d = new BigDecimal(3);
BigDecimal e = new BigDecimal(3L);
BigDecimal f = new BigDecimal("3");
System.out.println(a);
System.out.println(b);
System.out.println(c);
System.out.println(d);
System.out.println(e);
System.out.println(f);
}
运行结果:
10000000
13
2.3300000000000000710542735760100185871124267578125
3
3
3
由以上结果可以看出,使用double类型进行转化时有一些不可预知性,不推荐使用double类型转化。
2.常见方法
修饰符和类型 | 方法 | 说明 |
BigDecimal | abs() | 返回 |
BigDecimal | abs(MathContext mc) | 返回 |
BigDecimal | add(BigDecimal augend) | 返回 |
BigDecimal | add(BigDecimal augend, MathContext mc) | 返回 |
byte | 将其转换 | |
int | compareTo(BigDecimal val) | 将此 |
BigDecimal | divide(BigDecimal divisor) | 返回 |
BigDecimal | divide(BigDecimal divisor, int roundingMode) | 返回 |
BigDecimal | divide(BigDecimal divisor, int scale, int roundingMode) | 返回 |
BigDecimal | divide(BigDecimal divisor, int scale, RoundingMode roundingMode) | 返回 |
BigDecimal | divide(BigDecimal divisor, MathContext mc) | 返回 |
BigDecimal | divide(BigDecimal divisor, RoundingMode roundingMode) | 返回 |
BigDecimal [ ] | divideAndRemainder(BigDecimal divisor) | 返回一个二元素 |
BigDecimal [ ] | divideAndRemainder(BigDecimal divisor, MathContext mc) | 返回一个二元素 |
BigDecimal | divideToIntegralValue(BigDecimal divisor) | 返回 |
BigDecimal | divideToIntegralValue(BigDecimal divisor, MathContext mc) | 返回 |
double | 将此转换 | |
boolean | 将此 | |
float | 将此转换 | |
int | hashCode() | 返回 this 的哈希码 |
int | intValue() | 将此转换 |
int | 将其转换 | |
long | 将此转换 | |
long | 将其转换 | |
BigDecimal | max(BigDecimal val) |
|
BigDecimal | min(BigDecimal val) |
|
BigDecimal | movePointLeft(int n) | 返回一个 |
BigDecimal | movePointRight(int n) | 返回一个 |
BigDecimal | multiply(BigDecimal multiplicand) | 返回 |
BigDecimal | multiply(BigDecimal multiplicand, MathContext mc) | 返回 |
BigDecimal | negate() | 返回 |
BigDecimal | negate(MathContext mc) | 返回 |
BigDecimal | plus() | 返回 |
BigDecimal | plus(MathContext mc) | 返回 |
BigDecimal | pow(int n) | 返回 |
BigDecimal | pow(int n, MathContext mc) | 返回 |
int | 返回this的精度 | |
BigDecimal | remainder(BigDecimal divisor) | 返回 |
BigDecimal | remainder(BigDecimal divisor, MathContext mc) | 返回 |
BigDecimal | round(MathContext mc) |
|
int | scale() | 返回this的比例 |
BigDecimal | scaleByPowerOfTen(int n) | 返回数值等于 ( |
BigDecimal | setScale(int newScale) | 返回 |
BigDecimal | setScale(int newScale, int roundingMode) | 返回 |
BigDecimal | setScale(int newScale, RoundingMode roundingMode) | 返回 |
short | 将其转换 | |
int | signum() | 返回 this 的符号函数 |
BigDecimal | 返回一个 | |
BigDecimal | subtract(BigDecimal subtrahend) | 返回 a |
BigDecimal | subtract(BigDecimal subtrahend, MathContext mc) | 返回 a |
BigInteger | 将此转换 | |
BigInteger | 将其转换 | |
String |
| |
String |
| |
String | toString() |
|
BigDecimal | ulp() | 返回 this 的 ulp 的大小,最后一个单位 |
BigInteger | 返回 a | |
static BigDecimal | valueOf(double val) | 使用方法提供的规范字符串表示将 a |
static BigDecimal | valueOf(long val) | 将 |
static BigDecimal | valueOf(long unscaledVal, int scale) | 将 |
常用的方法有加、减、乘、除。主要涉及两个参数MathContext和RoundingMode,MathContext提供了不可变对象,它们封装了上下文设置,并描述了数值运算符的某些规则,例如BigDecimal类实现的规则。主要描述如下:
字段 | 描述 |
MathContext.UNLIMITEO | 一个MathContext对象,其设置具有无限精度算术所需的值。 |
MathContext.DECIMAL32 | 一个MathContext对象,其精度设置与IEEE 754R Decimal32格式匹配,为7位数,舍入模式为HALF_EVEN,即IEEE 754R默认值。 |
MathContext.DECIMAL64 | MathContext对象,其精度设置与IEEE 754R Decimal64格式匹配,16位数字和HALF_EVEN的舍入模式,即IEEE 754R默认值。 |
MathContext.DECIMAL128 | MathContext对象,其精度设置与IEEE 754R Decimal128格式匹配,为34位数,舍入模式为HALF_EVEN,即IEEE 754R默认值。 |
RoundingMode是一个公共枚举类,常见的枚举常量如下:
枚举常量 | 描述 |
CEILING | 舍入模式向正无穷大舍入。 |
DOWN | 舍入模式向零舍入。 |
FLOOR | 舍入模式向负无穷大舍入。 |
HALF_DOWN | 舍入模式向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下向下舍入。 |
HALF_EVEN | 舍入模式向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下,向偶数邻居舍入。 |
HALF_UP | 舍入模式向“最近的邻居”舍入,除非两个邻居是等距的,在这种情况下向上舍入。 |
UNNECESSARY | 舍入模式断言所请求的操作具有精确的结果,因此不需要舍入。 |
UP | 舍入模式从零舍入。 |
方法示例:
public static void main(String[] args){
BigDecimal a = new BigDecimal("10.3333");
BigDecimal b = new BigDecimal("3");
//加法 均返回13.3333
System.out.println(a.add(b));
System.out.println(a.add(b,MathContext.UNLIMITED));
//减法 均返回7.3333
System.out.println(a.subtract(b));
System.out.println(a.subtract(b,MathContext.UNLIMITED));
//乘法 均返回30.9999
System.out.println(a.multiply(b));
System.out.println(a.multiply(b,MathContext.UNLIMITED));
//除法
// 当出现除不尽情况时,抛出ArithmeticException异常
System.out.println(a.divide(b));
//返回3.4445
System.out.println(a.divide(b,2));
//返回3.45
System.out.println(a.divide(b,2,2));
//返回3.44
System.out.println(a.divide(b,2,RoundingMode.HALF_UP));
//抛出ArithmeticException异常
System.out.println(a.divide(b,MathContext.UNLIMITED));
//返回3.4444
System.out.println(a.divide(b,RoundingMode.HALF_UP));
}
MathContext和RoundingMode的使用可根据项目情况选择,需要注意的是当使用除法时,如果出现除不尽的情况,直接使用divide(BigDecimal divisor)和divide(BigDecimal divisor,MathContext mc)方法时,会抛出异常。
总结
以上就是今天要讲的内容,本文仅仅简单介绍了BigDecimal的使用,而BigDecimal提供了大量能使我们快速便捷地处理数据的函数和方法。