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  ;  
posted @ 2019-04-18 10:15  hy_wx  阅读(1098)  评论(0编辑  收藏  举报