- 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 = new BigDecimal(d); BigDecimal doubleToBigDecimal_0 = new BigDecimal(d, MathContext.UNLIMITED); BigDecimal doubleToBigDecimal_7 = new BigDecimal(d, MathContext.DECIMAL32); BigDecimal doubleToBigDecimal_16 = new BigDecimal(d, MathContext.DECIMAL64); BigDecimal doubleToBigDecimal_34 = new BigDecimal(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(long val, MathContext mc)
Long l = 10091L; l = 100900L; BigDecimal longToBigDecimal = new BigDecimal(l); BigDecimal longToBigDecimal_0 = new BigDecimal(l, MathContext.UNLIMITED); BigDecimal longToBigDecimal_7 = new BigDecimal(l, MathContext.DECIMAL32); BigDecimal longToBigDecimal_16 = new BigDecimal(l, MathContext.DECIMAL64); BigDecimal longToBigDecimal_34 = new BigDecimal(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 = new BigDecimal(str); BigDecimal strToBigDecimal_0 = new BigDecimal(str, MathContext.UNLIMITED); BigDecimal strToBigDecimal_7 = new BigDecimal(str, MathContext.DECIMAL32); BigDecimal strToBigDecimal_16 = new BigDecimal(str, MathContext.DECIMAL64); BigDecimal strToBigDecimal_34 = new BigDecimal(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为精度取值 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, introundingMode)的意思是说:
我用一个BigDecimal对象除以divisor后的结果,并且要求这个结果保留有scale个小数位,roundingMode表示的就是保留模式是什么,是四舍五入啊还是其它的
- divide(BigDecimal divisor, int scale, introundingMode)的意思是说:
- compareTo比较大小
- 返回值 -1 小于 0 等于 1 大于
取其中最大、最小值、绝对值、相反数
- a.max (b) //比较取最大值
- a.min(b) //比较取最小值
- a.abs()//取最绝对值
- a.negate()//取相反数
注意
枚举常量用法摘要
- CEILING:向正无限大方向舍入的舍入模式
- DOWN:向零方向舍入的舍入模式
- FLOOR:向负无限大方向舍入的舍入模式
- HALF_DOWN:向最接近数字方向舍入的舍入模式,如果与两个响铃数字的距离相等,则向下舍入
- HALF_EVEN:向最接近你数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向响铃的偶数舍入
- HALF_UP:向最接近数字方向舍入的舍入模式,如果与两个相邻数字的距离相等,则向上舍入
- UNNECESSARY:用于断言请求的操作具有精确结果的舍入模式,因此不需要舍入
- UP:远离零方向舍入的舍入模式
关于BigDecimal格式化
public String formatValue(Object value){
String content = null;
if (value == null) {
content = "";
} else {
if(value instanceof BigDecimal){
//conver to fortmat String
NumberFormat nf = NumberFormat.getInstance();
nf.setMinimumFractionDigits(2);
nf.setMaximumFractionDigits(2);
content = nf.format(value);
}else{
content = String.valueOf(value);
}
}
return content;
}
- 使用这样一个方法可以达到格式化的效果,下面的setMaximumFractionDigits
表示小数点后面的精确位数。
- NumberFormat的货币格式:
-
- getCurrencyInstance(): 返回当前默认环境的货币格式
- getCurrencyInstance(Local local):返回指定货币格式的nubmber对象
String str = "187";
str = "187.9";
BigDecimal strToBigDecimal = new BigDecimal(str);
BigDecimal strToBigDecimal_0 = new BigDecimal(str, MathContext.UNLIMITED);
BigDecimal strToBigDecimal_7 = new BigDecimal(str, MathContext.DECIMAL32);
BigDecimal strToBigDecimal_16 = new BigDecimal(str, MathContext.DECIMAL64);
BigDecimal strToBigDecimal_34 = new BigDecimal(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 ;