概述
本文简单介绍了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 ,其值为 this 的绝对值BigDecimal ,其标度为 this.scale() |
BigDecimal | abs(MathContext mc) | 返回 BigDecimal ,其值为 this 的绝对值BigDecimal ,并根据上下文设置进行舍入 |
BigDecimal | add(BigDecimal augend) | 返回 BigDecimal ,其值为(this + augend) ,其比例为max(this.scale(), augend.scale()) |
BigDecimal | add(BigDecimal augend, MathContext mc) | 返回 BigDecimal ,其值为(this + augend) ,根据上下文设置进行舍入 |
byte | byteValueExact() | 将其转换BigDecimal 为 byte ,检查丢失的信息 |
int | compareTo(BigDecimal val) | 将此BigDecimal 与指定的 BigDecimal 比较,大于返回1,等于返回0,小于返回-1 |
BigDecimal | divide(BigDecimal divisor) | 返回 BigDecimal ,其值为(this / divisor) ,其首选比例为(this.scale() - divisor.scale()) ; 如果无法表示确切的商(因为它有一个非终止的十进制扩展),ArithmeticException 则抛出一个异常 |
BigDecimal | divide(BigDecimal divisor, int roundingMode) | 返回 BigDecimal ,其值为(this / divisor) ,其比例为this.scale() |
BigDecimal | divide(BigDecimal divisor, int scale, int roundingMode) | 返回 BigDecimal ,其值为(this / divisor) ,并且其比例为指定的 |
BigDecimal | divide(BigDecimal divisor, int scale, RoundingMode roundingMode) | 返回 BigDecimal ,其值为(this / divisor) ,并且其比例为指定的 |
BigDecimal | divide(BigDecimal divisor, MathContext mc) | 返回 BigDecimal ,其值为(this / divisor) ,根据上下文设置进行舍入 |
BigDecimal | divide(BigDecimal divisor, RoundingMode roundingMode) | 返回 BigDecimal ,其值为(this / divisor) ,其比例为this.scale() |
BigDecimal [ ] | divideAndRemainder(BigDecimal divisor) | 返回一个二元素BigDecimal 数组,其中包含 的结果,divideToIntegralValue 后跟 remainder 两个操作数的结果 |
BigDecimal [ ] | divideAndRemainder(BigDecimal divisor, MathContext mc) | 返回一个二元素BigDecimal 数组,其中包含的结果divideToIntegralValue 后跟 remainder 根据上下文设置通过舍入计算的两个操作数的结果 |
BigDecimal | divideToIntegralValue(BigDecimal divisor) | 返回 BigDecimal ,其值为(this / divisor) 四舍五入的商的整数部分 |
BigDecimal | divideToIntegralValue(BigDecimal divisor, MathContext mc) | 返回 BigDecimal ,其值为 的整数部分(this / divisor) |
double | doubleValue() | 将此转换BigDecimal 为double |
boolean | equals(Object x) | 将此BigDecimal 与指定 Object 的相等性进行比较 |
float | floatValue() | 将此转换BigDecimal 为float |
int | hashCode() | 返回 this 的哈希码BigDecimal |
int | intValue() | 将此转换BigDecimal 为int |
int | intValueExact() | 将其转换BigDecimal 为int ,检查丢失的信息 |
long | longValue() | 将此转换BigDecimal 为long |
long | longValueExact() | 将其转换BigDecimal 为 a long ,检查丢失的信息 |
BigDecimal | max(BigDecimal val) | BigDecimal 返回 this和的最大值val |
BigDecimal | min(BigDecimal val) | BigDecimal 返回 this和 的最小值val |
BigDecimal | movePointLeft(int n) | 返回一个BigDecimal 与此等效的 a,小数点n 向左移动 |
BigDecimal | movePointRight(int n) | 返回一个BigDecimal 与此等效的 a,小数点n 向右移动 |
BigDecimal | multiply(BigDecimal multiplicand) | 返回 BigDecimal ,其值为(this × multiplicand),其比例为(this.scale() + multiplicand.scale()) |
BigDecimal | multiply(BigDecimal multiplicand, MathContext mc) | 返回 BigDecimal ,其值为(this × multiplicand),根据上下文设置进行舍入 |
BigDecimal | negate() | 返回 BigDecimal ,其值为(-this) ,其比例为this.scale() |
BigDecimal | negate(MathContext mc) | 返回 BigDecimal ,其值为(-this) ,根据上下文设置进行舍入 |
BigDecimal | plus() | 返回 BigDecimal ,其值为(+this) ,其比例为this.scale() |
BigDecimal | plus(MathContext mc) | 返回 BigDecimal ,其值为(+this) ,根据上下文设置进行舍入 |
BigDecimal | pow(int n) | 返回BigDecimal 值为 (this )的 a ,精确计算幂,精度不受限制 |
BigDecimal | pow(int n, MathContext mc) | 返回BigDecimal 值为 (this n )的 a |
int | precision() | 返回this的精度BigDecimal |
BigDecimal | remainder(BigDecimal divisor) | 返回BigDecimal 值为 的(this % divisor) |
BigDecimal | remainder(BigDecimal divisor, MathContext mc) | 返回 BigDecimal ,其值为(this % divisor) ,根据上下文设置进行舍入 |
BigDecimal | round(MathContext mc) | BigDecimal 根据 设置返回四舍五入MathContext |
int | scale() | 返回this的比例BigDecimal |
BigDecimal | scaleByPowerOfTen(int n) | 返回数值等于 ( this * 10 n ) 的 BigDecimal |
BigDecimal | setScale(int newScale) | 返回 BigDecimal ,其比例为指定值,其值在数值上等于 this BigDecimal |
BigDecimal | setScale(int newScale, int roundingMode) | 返回 BigDecimal ,其标度为指定值,其未标度值由 this 的未标度值乘以或除以BigDecimal 适当的 10 次方来确定,以保持其整体值 |
BigDecimal | setScale(int newScale, RoundingMode roundingMode) | 返回 BigDecimal ,其标度为指定值,其未标度值由 this 的未标度值乘以或除以BigDecimal 适当的 10 次方来确定,以保持其整体值 |
short | shortValueExact() | 将其转换BigDecimal 为 a short ,检查丢失的信息 |
int | signum() | 返回 this 的符号函数BigDecimal |
BigDecimal | stripTrailingZeros() | 返回一个BigDecimal 在数值上等于这个值但从表示中删除任何尾随零的值 |
BigDecimal | subtract(BigDecimal subtrahend) | 返回 a BigDecimal ,其值为(this - subtrahend) ,其比例为max(this.scale(), subtrahend.scale()) |
BigDecimal | subtract(BigDecimal subtrahend, MathContext mc) | 返回 a BigDecimal ,其值为(this - subtrahend) ,根据上下文设置进行舍入 |
BigInteger | toBigInteger() | 将此转换BigDecimal 为BigInteger |
BigInteger | toBigIntegerExact() | 将其转换BigDecimal 为 a BigInteger ,检查丢失的信息 |
String | toEngineeringString() | BigDecimal 如果需要指数,则使用工程符号返回 this 的字符串表示形式 |
String | toPlainString() | BigDecimal 返回不带指数字段的字符串表示形式 |
String | toString() | BigDecimal 如果需要指数,则使用科学记数法返回 this 的字符串表示形式 |
BigDecimal | ulp() | 返回 this 的 ulp 的大小,最后一个单位 BigDecimal |
BigInteger | unscaledValue() | 返回 a BigInteger ,其值为this的未缩放值BigDecimal |
static BigDecimal | valueOf(double val) | 使用方法提供的规范字符串表示将 adouble 转换为 a 。BigDecimal double Double.toString(double) |
static BigDecimal | valueOf(long val) | 将long 值转换为BigDecimal 比例为零的 a |
static BigDecimal | valueOf(long unscaledVal, int scale) | 将long 未缩放的值和 int 比例转换为BigDecimal |
常用的方法有加、减、乘、除。主要涉及两个参数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提供了大量能使我们快速便捷地处理数据的函数和方法。
参考:
BigDecimal_百度百科
BigDecimal (Java Platform SE 8 )
MathContext - Java.math 中文教程 - 开发文档 - 文江博客
RoundingMode (Java Platform SE 7 )
最后
以上就是单身钢铁侠为你收集整理的【BigDecimal基础用法】前言二、基础方法的全部内容,希望文章能够帮你解决【BigDecimal基础用法】前言二、基础方法所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复