【BigDecimal基础用法】

本文简单介绍了BigDecimal的一些常见用法。

文章目录


前言

最近项目中有很多涉及到数值计算的数据,采用了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.常见方法

修饰符和类型方法说明
BigDecimalabs()返回 BigDecimal,其值为 this 的绝对值BigDecimal,其标度为 this.scale()
BigDecimalabs(MathContext mc)返回 BigDecimal,其值为 this 的绝对值BigDecimal,并根据上下文设置进行舍入
BigDecimaladd(BigDecimal augend)返回 BigDecimal,其值为(this + augend),其比例为max(this.scale(), augend.scale())
BigDecimaladd(BigDecimal augend, MathContext mc)返回 BigDecimal,其值为(this + augend),根据上下文设置进行舍入
bytebyteValueExact()将其转换BigDecimal为 byte,检查丢失的信息
intcompareTo(BigDecimal val)将此BigDecimal与指定的 BigDecimal比较,大于返回1,等于返回0,小于返回-1
BigDecimaldivide(BigDecimal divisor)返回 BigDecimal,其值为(this / divisor),其首选比例为(this.scale() - divisor.scale()); 如果无法表示确切的商(因为它有一个非终止的十进制扩展),ArithmeticException则抛出一个异常
BigDecimaldivide(BigDecimal divisor, int roundingMode)返回 BigDecimal,其值为(this / divisor),其比例为this.scale()
BigDecimaldivide(BigDecimal divisor, int scale, int roundingMode)返回 BigDecimal,其值为(this / divisor),并且其比例为指定的
BigDecimaldivide(BigDecimal divisor, int scale, RoundingMode roundingMode)返回 BigDecimal,其值为(this / divisor),并且其比例为指定的
BigDecimaldivide(BigDecimal divisor, MathContext mc)返回 BigDecimal,其值为(this / divisor),根据上下文设置进行舍入
BigDecimaldivide(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根据上下文设置通过舍入计算的两个操作数的结果
BigDecimaldivideToIntegralValue(BigDecimal divisor)返回 BigDecimal,其值为(this / divisor)四舍五入的商的整数部分
BigDecimaldivideToIntegralValue(BigDecimal divisor, MathContext mc)返回 BigDecimal,其值为 的整数部分(this / divisor)
doubledoubleValue()将此转换BigDecimaldouble
booleanequals(Object x)将此BigDecimal与指定 Object的相等性进行比较
floatfloatValue()将此转换BigDecimalfloat
inthashCode()返回 this 的哈希码BigDecimal
intintValue()将此转换BigDecimalint
intintValueExact()将其转换BigDecimalint,检查丢失的信息
longlongValue()将此转换BigDecimallong
longlongValueExact()将其转换BigDecimal为 a long,检查丢失的信息
BigDecimalmax(BigDecimal val)BigDecimal返回 this和的最大值val
BigDecimalmin(BigDecimal val)BigDecimal返回 this和 的最小值val
BigDecimalmovePointLeft(int n)返回一个BigDecimal与此等效的 a,小数点n向左移动
BigDecimalmovePointRight(int n)返回一个BigDecimal与此等效的 a,小数点n向右移动
BigDecimalmultiply(BigDecimal multiplicand)返回 BigDecimal,其值为(this × multiplicand),其比例为(this.scale() + multiplicand.scale())
BigDecimalmultiply(BigDecimal multiplicand, MathContext mc)返回 BigDecimal,其值为(this × multiplicand),根据上下文设置进行舍入
BigDecimalnegate()返回 BigDecimal,其值为(-this),其比例为this.scale()
BigDecimalnegate(MathContext mc)返回 BigDecimal,其值为(-this),根据上下文设置进行舍入
BigDecimalplus()返回 BigDecimal,其值为(+this),其比例为this.scale()
BigDecimalplus(MathContext mc)返回 BigDecimal,其值为(+this),根据上下文设置进行舍入
BigDecimalpow(int n)返回BigDecimal值为 (this  )的 a ,精确计算幂,精度不受限制
BigDecimalpow(int n, MathContext mc)返回BigDecimal值为 (this n )的 a
intprecision()返回this的精度BigDecimal
BigDecimalremainder(BigDecimal divisor)返回BigDecimal值为 的(this % divisor)
BigDecimalremainder(BigDecimal divisor, MathContext mc)返回 BigDecimal,其值为(this % divisor),根据上下文设置进行舍入
BigDecimalround(MathContext mc)BigDecimal根据 设置返回四舍五入MathContext
intscale()返回this的比例BigDecimal
BigDecimalscaleByPowerOfTen(int n)返回数值等于 ( this* 10 n ) 的 BigDecimal
BigDecimalsetScale(int newScale)返回 BigDecimal,其比例为指定值,其值在数值上等于 this BigDecimal
BigDecimalsetScale(int newScale, int roundingMode)返回 BigDecimal,其标度为指定值,其未标度值由 this 的未标度值乘以或除以BigDecimal适当的 10 次方来确定,以保持其整体值
BigDecimalsetScale(int newScale, RoundingMode roundingMode)返回 BigDecimal,其标度为指定值,其未标度值由 this 的未标度值乘以或除以BigDecimal适当的 10 次方来确定,以保持其整体值
shortshortValueExact()将其转换BigDecimal为 a short,检查丢失的信息
intsignum()返回 this 的符号函数BigDecimal
BigDecimalstripTrailingZeros()返回一个BigDecimal在数值上等于这个值但从表示中删除任何尾随零的值
BigDecimalsubtract(BigDecimal subtrahend)返回 a BigDecimal,其值为(this - subtrahend),其比例为max(this.scale(), subtrahend.scale())
BigDecimalsubtract(BigDecimal subtrahend, MathContext mc)返回 a BigDecimal,其值为(this - subtrahend),根据上下文设置进行舍入
BigIntegertoBigInteger()将此转换BigDecimalBigInteger
BigIntegertoBigIntegerExact()将其转换BigDecimal为 a BigInteger,检查丢失的信息
StringtoEngineeringString()BigDecimal如果需要指数,则使用工程符号返回 this 的字符串表示形式
StringtoPlainString()BigDecimal 返回不带指数字段的字符串表示形式
StringtoString()BigDecimal如果需要指数,则使用科学记数法返回 this 的字符串表示形式
BigDecimalulp()返回 this 的 ulp 的大小,最后一个单位 BigDecimal
BigIntegerunscaledValue()返回 a BigInteger,其值为this的未缩放值BigDecimal
static BigDecimalvalueOf(double val)使用方法提供的规范字符串表示将 adouble转换为 a 。BigDecimaldoubleDouble.toString(double)
static BigDecimalvalueOf(long val)long值转换为BigDecimal 比例为零的 a
static BigDecimalvalueOf(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 )

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值