java.math.BigDecimal类
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为精度取值
注意以下相除会抛出异常,原因: 通过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格式化
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 ;