• 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  ;  
  • 相关阅读:
    八大排序
    链表的合并
    记录B站yxc的背包九讲相关代码
    C++中多态实现
    YOLOV4所用到的一些tricks
    C++中的string 和 stringstream 的知识
    博客园中插入视频
    博客园中插入网页
    面试前必须要知道的【可重入锁 自旋锁】
    面试前必须要知道的【乐观锁 悲观锁】
  • 原文地址:https://www.cnblogs.com/xhy-shine/p/9016155.html
Copyright © 2020-2023  润新知