BigDecimal提供算数、标度操作、舍入、比较、哈希算法和格式转换。toString方法提供BigDecimal的规范表示形式
一、静态变量
ONE、TEN、 ZERO:指定值,并返回
ROUND_****:值从0到7的范围
二、构造函数
new BigDecimal(BigInteger unscaledVal, int scale)
BigDecimal d0 = new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_UP);
BigDecimal d1= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_DOWN);
BigDecimal d2= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_CEILING);
BigDecimal d3= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_FLOOR);
BigDecimal d4= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_UP);
BigDecimal d5= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_DOWN);
BigDecimal d6= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_HALF_EVEN);
BigDecimal d7= new BigDecimal(BigInteger.valueOf(99900L), BigDecimal.ROUND_UNNECESSARY);
System.out.println(d0);//99900
System.out.println(d1);//9990.0
System.out.println(d2);//999.00
System.out.println(d3);//99.900
System.out.println(d4);//9.9900
System.out.println(d5);//0.99900
System.out.println(d6);//0.099900
System.out.println(d7);//0.0099900
new BigDecimal(double val, MathContext mc)
double d = 16.1;//d = 6.000;
BigDecimal doubleToBigDecimal= newBigDecimal(d);
BigDecimal doubleToBigDecimal_0= newBigDecimal(d, MathContext.UNLIMITED);
BigDecimal doubleToBigDecimal_7= newBigDecimal(d, MathContext.DECIMAL32);
BigDecimal doubleToBigDecimal_16= newBigDecimal(d, MathContext.DECIMAL64);
BigDecimal doubleToBigDecimal_34= newBigDecimal(d, MathContext.DECIMAL128);
System.out.println(doubleToBigDecimal);//d=6.000:6 d=16.1:16.10000000000000142108547152020037174224853515625
System.out.println(doubleToBigDecimal_0); //d=6.000:6 d=16.1:和上述一样,16.10000000000000142108547152020037174224853515625
System.out.println(doubleToBigDecimal_7); //d=6.000:6 d=6.1:保留7位数,包含小数和整数
System.out.println(doubleToBigDecimal_16); //d=6.000:6 d=6.1:保留16位数,包含小数和整数
System.out.println(doubleToBigDecimal_34); //d=6.000:6 d=6.1:保留34位数,包含小数和整数
new BigDecimal(longval, MathContext mc)
Long l = 10091L;
l= 100900L;
BigDecimal longToBigDecimal= newBigDecimal(l);
BigDecimal longToBigDecimal_0= newBigDecimal(l, MathContext.UNLIMITED);
BigDecimal longToBigDecimal_7= newBigDecimal(l, MathContext.DECIMAL32);
BigDecimal longToBigDecimal_16= newBigDecimal(l, MathContext.DECIMAL64);
BigDecimal longToBigDecimal_34= newBigDecimal(l, MathContext.DECIMAL128);
System.out.println(longToBigDecimal);//100901 ; 100900
System.out.println(longToBigDecimal_0); //100901 ; 100900
System.out.println(longToBigDecimal_7); //100901 ; 100900
System.out.println(longToBigDecimal_16);//100901 ; 100900
System.out.println(longToBigDecimal_34);//100901 ; 100900
new BigDecimal(String val, MathContext mc)
String str = "187";
str= "187.9";
BigDecimal strToBigDecimal= newBigDecimal(str);
BigDecimal strToBigDecimal_0= newBigDecimal(str, MathContext.UNLIMITED);
BigDecimal strToBigDecimal_7= newBigDecimal(str, MathContext.DECIMAL32);
BigDecimal strToBigDecimal_16= newBigDecimal(str, MathContext.DECIMAL64);
BigDecimal strToBigDecimal_34= newBigDecimal(str, MathContext.DECIMAL128);
System.out.println(strToBigDecimal);//187 ; 187.9
System.out.println(strToBigDecimal_0); //187 ; 187.9
System.out.println(strToBigDecimal_7); //187 ; 187.9
System.out.println(strToBigDecimal_16); //187 ; 187.9
System.out.println(strToBigDecimal_34); //187 ; 187.9
三、常用方法
add(BigDecimal val)
subtract(BigDecimal val)
myltiply(BigDecimal val)
divide(BigDecimal val, RoundingMode mode)
a.divide(b,2);//2为精度取值
注意以下相除会抛出异常,原因: 通过BigDecimal的divide方法进行除法时当不整除,出现无限循环小数时,就会抛异常
//BigDecimal divideBg = a.divide(b);
//解决方法是:设置精确度;就是给divide设置精确的小数点
divide(xxxxx,2, BigDecimal.ROUND_HALF_EVEN)
//其中的第二个参数表示的是:保留小数点之后多少位
除法的详细说明
divide(BigDecimal divisor, int scale, introundingMode)
BigDecimal的setScale方法
用于格式化小数点
setScale(1):表示保留一位小数,默认用四舍五入的方式;
setScale(1, BigDecimal.ROUND_DOWN):直接删除多余的小数位,如2.35会变成2.3
setScale(1, BigDecimal.ROUND_UP):进位处理,2.35变成2.4
setScale(1,BigDecimal.ROUND_HALF_UP):四舍五入,2.35变成2.4
setScaler(1,BigDecimal.ROUND_HALF_DOWN):四舍五入,2.35变成2.3,如果是5则向下舍入
注意点一:scale指的就是你小数点后的位数;scale()就是BigDecimal类中的方法,b.scale()返回b小数点后的位数
注意点二:roundingMode是小数的保留模式。他们都是BigDecimal中的常量字段,如:BigDecimal.ROUND_HALF_UP表示的就是四舍五入
注意点三:divide(BigDecimal divisor, int scale, int roundingMode)的意思是说: 我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的
compareTo()
compareTo()方法用来比较两个值的大小,返回值为0、-1、1( -1 小于 0 等于 1 大于)
取其中最大、最小值、绝对值、相反数
a.max (b) //比较取最大值
a.min(b) //比较取最小值
a.abs()//取最绝对值
a.negate()//取相反数
四、舍入模式常量解释
ROUND_CEILING:向正无限大方向舍入的舍入模式
ROUND_DOWN:向零方向舍入的舍入模式
ROUND_FLOOR:向负无限大方向舍入的舍入模式
ROUND_HALF_DOWN:向最接近数字方向舍入的舍入模式,如果与两个响铃数字的距离相等,则向下舍入
ROUND_HALF_EVEN:向最接近你数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向响铃的偶数舍入
ROUND_HALF_UP:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入
ROUND_UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入
ROUND_UP:远离零方向舍入的舍入模式
五、关于BigDecimal格式化
publicString formatValue(Object value){
String content= null;if (value == null) {
content= "";
}else{if(value instanceofBigDecimal){//conver to fortmat String
NumberFormat nf =NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
content=nf.format(value);
}else{
content=String.valueOf(value);
}
}returncontent;
}
使用这样一个方法可以达到格式化的效果,下面的setMaximumFractionDigits
表示小数点后面的精确位数。
NumberFormat的货币格式:
getCurrencyInstance(): 返回当前默认环境的货币格式
getCurrencyInstance(Local local):返回指定货币格式的nubmber对象
String str = "187";
str= "187.9";
BigDecimal strToBigDecimal= newBigDecimal(str);
BigDecimal strToBigDecimal_0= newBigDecimal(str, MathContext.UNLIMITED);
BigDecimal strToBigDecimal_7= newBigDecimal(str, MathContext.DECIMAL32);
BigDecimal strToBigDecimal_16= newBigDecimal(str, MathContext.DECIMAL64);
BigDecimal strToBigDecimal_34= newBigDecimal(str, MathContext.DECIMAL128);
System.out.println(strToBigDecimal);//187 ; 187.9
System.out.println(strToBigDecimal_0); //187 ; 187.9
System.out.println(strToBigDecimal_7); //187 ; 187.9
System.out.println(strToBigDecimal_16); //187 ; 187.9
System.out.println(strToBigDecimal_34); //187 ;