Java中浮点数运算会出现损失精度的问题,且对数的长度也有一定的限制,所以对小数运算和大数运算都不够友好。
在商业计算,例如银行交易中,可以使用BigDecimal类进行运算。
java.math.BigDecimal BigDecimal (Java Platform SE 8 )
1、对象创建
BigDecimal对象的创建可以分为三类:
①传入BigInteger对象
BigDecimal(BigInteger val) // 将BigInteger转换为BigDecimal
BigDecimal(BigInteger unscaledVal, int scale) // 把一个没有小数的BigInteger转变成指定scale小数位数的BigDecimal
BigDecimal(BigInteger unscaledVal, int scale, MathContext mc) // 按照上面的方法得到BigDecimal,再根据 MathContext 取舍上下文取舍
BigDecimal(BigInteger val, MathContext mc)
②传入字符串
BigDecimal(char[] in)
BigDecimal(char[] in, int offset, int len) // 字符数组中开始为offset长度为len的部分
BigDecimal(char[] in, int offset, int len, MathContext mc)
BigDecimal(char[] in, MathContext mc)
③传入基础数据类型
BigDecimal(double val)
BigDecimal(double val, MathContext mc)
BigDecimal(int val)
BigDecimal(int val, MathContext mc)
BigDecimal(long val)
BigDecimal(long val, MathContext mc)
④传入String类型
BigDecimal(String val)
BigDecimal(String val, MathContext mc)
不推荐传入浮点数double创建对象,因为在传递过程中会出现精度损失。可以传入String类型或整数类型。
2、基本方法
add(BigDecimal augend) // 返回值为this + augend的BigDecimal对象
divide(BigDecimal divisor) // 返回值为this / divisor的BigDecimal对象
multiply(BigDecimal multiplicand) // 返回值为this × multiplicand的BigDecimal对象
subtract(BigDecimal subtrahend) // 返回值为this - subtrahend的BigDecimal对象
toString() // 将BigDecimal对象的数值转换成字符串
doubleValue() // 将BigDecimal对象中的值以双精度数返回
floatValue() // 将BigDecimal对象中的值以单精度数返回
longValue() // 将BigDecimal对象中的值以长整数返回
intValue() // 将BigDecimal对象中的值以整数返回
其中,进行除法运算时,divide(BigDecimal)如果不能整除会报错java.lang.ArithmeticException,为了避免这个错误,要多传两个参数来规定小数的舍入位数和舍入模式。
divide(BigDecimal divisor, int scale, int roundingMode)
舍入模式包括以下几种:
ROUND_CEILING //向正无穷方向舍入
ROUND_DOWN //向零方向舍入
ROUND_FLOOR //向负无穷方向舍入
ROUND_HALF_DOWN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
ROUND_UNNECESSARY //计算结果是精确的,不需要舍入模式
ROUND_UP //向远离0的方向舍入