本文简单介绍了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()

将此转换BigDecimaldouble

boolean

equals(Object x)

将此BigDecimal与指定 Object的相等性进行比较

float

floatValue()

将此转换BigDecimalfloat

int

hashCode()

返回 this 的哈希码BigDecimal

int

intValue()

将此转换BigDecimalint

int

intValueExact()

将其转换BigDecimalint,检查丢失的信息

long

longValue()

将此转换BigDecimallong

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()

将此转换BigDecimalBigInteger

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 。BigDecimaldoubleDouble.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提供了大量能使我们快速便捷地处理数据的函数和方法。