zoukankan      html  css  js  c++  java
  • BigDecimal 方法使用

    1 创建

            /**
             * 1 创建
             */
            //new 对象
            BigDecimal a = new BigDecimal("3");
            // 内部静态
            BigDecimal b = BigDecimal.valueOf(23L);
            BigDecimal c = BigDecimal.ONE;
            BigDecimal d = BigDecimal.TEN;
            BigDecimal e = BigDecimal.ZERO;

    2 加减乘除

           /**
             * 1 创建
             */
            //new 对象
            BigDecimal a = new BigDecimal("3");
            // 内部静态
            BigDecimal b = BigDecimal.valueOf(23L);
            BigDecimal c = BigDecimal.ONE;
            BigDecimal d = BigDecimal.TEN;
            BigDecimal e = BigDecimal.ZERO;
    
            /**
             * 2  加减乘除 精度(除不尽情况报异常) 一般配合 scale方法+舎入方法
             */
    
            //加法 去2位小数
            BigDecimal add = b.add(a).setScale(2, BigDecimal.ROUND_HALF_UP);
            // 减法 取1位小数
            BigDecimal subtract = b.subtract(a).setScale(1, BigDecimal.ROUND_HALF_DOWN);
            // 乘法 取3位小数
            BigDecimal multiplyA = b.multiply(a).setScale(3, BigDecimal.ROUND_FLOOR);
            // 除法 取两位小数 divideA 写法是错误的 先➗ 除不尽就已经报异常了
            //BigDecimal divideA = b.divide(a).setScale(2, BigDecimal.ROUND_HALF_UP);
            BigDecimal divideB = b.divide(a, 2, BigDecimal.ROUND_HALF_UP);

    3 舎入模式

      3.1 ROUND_UP 向上取整

       

      3.2 ROUND_DOWN 向下取整

      3.3 ROUND_HALF_UP  四舍五入

      3.4ROUND_HALF_DOWN 五舍六入

     

      3.5 ROUND_FLOOR 负无穷

      3.6 ROUND_CEILING 正无穷

      3.7 ROUND_HALF_EVEN  银行家舎入法

    3.8 ROUND_UNNECESSARY 不需要舎入

    4 组合使用

    这里灵活多变,自己运用得当。

    5 方法 

      5.1 相等

      equals :比较精度

      compareTo:不比较精度 (一般用这个)

       5.2 max  最大值

       5.3 min 最小值

       5.4 pow 幂

       5.5 round

      5.6 abs 绝对值

      5.7 小数点移动

       5.8 negate 取反

      5.9 plus

       round 调用的就是plus

      5.10 ulp

     6 转换

    摘:测试代码

    public static void main(String[] args) {

    /**
    * 1 创建
    */
    //new 对象
    BigDecimal a = new BigDecimal("3");
    // 内部静态
    BigDecimal b = BigDecimal.valueOf(23L);
    BigDecimal c = BigDecimal.ONE;
    BigDecimal d = BigDecimal.TEN;
    BigDecimal e = BigDecimal.ZERO;

    /**
    * 2 加减乘除 精度(除不尽情况报异常) 一般配合 scale方法+舎入方法
    */

    //加法 去2位小数
    BigDecimal add = b.add(a).setScale(2, BigDecimal.ROUND_HALF_UP);
    // 减法 取1位小数
    BigDecimal subtract = b.subtract(a).setScale(1, BigDecimal.ROUND_HALF_DOWN);
    // 乘法 取3位小数
    BigDecimal multiplyA = b.multiply(a).setScale(3, BigDecimal.ROUND_FLOOR);
    // 除法 取两位小数 divideA 写法是错误的 先➗ 除不尽就已经报异常了
    //BigDecimal divideA = b.divide(a).setScale(2, BigDecimal.ROUND_HALF_UP);
    BigDecimal divideB = b.divide(a, 2, BigDecimal.ROUND_HALF_UP);





    /**
    * RoundingMode 舍入模式 8种 小数取舍测试
    */
    BigDecimal f = BigDecimal.valueOf(10);
    BigDecimal g = BigDecimal.valueOf(3);

    //小数位向上取整 3.333 -> 3.34
    BigDecimal divide1 = f.divide(g, 2, BigDecimal.ROUND_UP);
    //小数向下取整 3.333 -> 3.33
    BigDecimal divide2 = f.divide(g, 2, BigDecimal.ROUND_DOWN);
    //小数 四舍五入 3.333 -> 3.33
    BigDecimal divide3 = f.divide(g, 2, BigDecimal.ROUND_HALF_UP);
    /**
    * 小数 五舍六入
    * 0.5 ->0 divide4=0
    * 0.555 ->0.5 divide5=0.5
    */
    BigDecimal k = BigDecimal.valueOf(0.5);
    BigDecimal m = BigDecimal.valueOf(0.555);
    BigDecimal l = BigDecimal.valueOf(1);
    BigDecimal divide4 = k.divide(l, 0, BigDecimal.ROUND_HALF_DOWN);
    BigDecimal divide5 = m.divide(l, 2, BigDecimal.ROUND_HALF_DOWN);


    BigDecimal n = BigDecimal.valueOf(0.555);
    BigDecimal o = BigDecimal.valueOf(1);
    BigDecimal j = BigDecimal.valueOf(-0.555);
    /**
    * 正数 数字部分-向下取整 ROUND_UP 0.555 -> 0.55 divide6=0.55
    * 负数 数字部分-向上取整 ROUND_DOWN -0.555 -> -0.56 divide7=-0.56
    * 不管怎么取 最后的数往小的取 负无穷模式
    */
    BigDecimal divide6 = n.divide(o, 2, BigDecimal.ROUND_FLOOR);
    BigDecimal divide7 = j.divide(o, 2, BigDecimal.ROUND_FLOOR);

    /**
    *正数 数字部分-向上取整 ROUND_UP 0.555 -> 0.56 divide6=0.56
    *负数 数字部分-向下取整 ROUND_DOWN -0.555 -> -0.55 divide7=-0.55
    * 不管怎么取 最后的数往大的取 正无穷模式
    */
    BigDecimal divide8 = n.divide(o, 2, BigDecimal.ROUND_CEILING);
    BigDecimal divide9 = j.divide(o, 2, BigDecimal.ROUND_CEILING);

    /**
    * 银行家舎入法
    * 这里取两位小数
    * *小数第二位是奇数 四舍五入 ROUND_HALF_UP (四舍) 0.554 -> 0.55 divide11 =0.55
    *小数第二位是奇数 四舍五入 ROUND_HALF_UP (五入) 0.555 -> 0.56 divide10 =0.56
    *
    * 小数第二位是偶数 五舍六入 ROUND_HALF_DOWN (五舍) 0.565 -> 0.56 divide12 =0.56
    * 小数第二位是偶数 五舍六入 ROUND_HALF_DOWN (六入)0.566 -> 0.57 divide13 =0.57
    */
    BigDecimal x = BigDecimal.valueOf(0.555);
    BigDecimal r = BigDecimal.valueOf(0.554);

    BigDecimal z = BigDecimal.valueOf(0.565);
    BigDecimal s = BigDecimal.valueOf(0.566);

    BigDecimal y = BigDecimal.valueOf(1);

    BigDecimal divide10 = x.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
    BigDecimal divide11 = r.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);

    BigDecimal divide12 = z.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
    BigDecimal divide13 = s.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);

    /**
    *精确值 不需要舎入 有精度会报错 divide14 会报错
    */
    //BigDecimal divide14 = s.divide(y, 2, BigDecimal.ROUND_UNNECESSARY);
    BigDecimal divide14 = s.divide(y,BigDecimal.ROUND_UNNECESSARY);

    /**
    * 组合使用
    * 例如:(a*b)/(10-c) + d
    */
    BigDecimal add1 = a.multiply(b).divide(BigDecimal.TEN.subtract(c), 2, BigDecimal.ROUND_UP).add(d);

    /**
    * 转换string bigA
    * toPlainString:0.0000000007755443848456408430750165156389829002048230677246465347707271575927734375
    * toString: 7.755443848456408430750165156389829002048230677246465347707271575927734375E-10
    * toString() 科学计数法
    */
    BigDecimal bigA = new BigDecimal(Math.pow(0.5671, 25));
    BigDecimal bigB = new BigDecimal(Math.pow(0.5671, 25));
    BigDecimal bigD = new BigDecimal(2);

    /**
    * 比较
    *   equals :比较精度
    *   compareTo:不比较精度 (一般用这个)
    * 至于为什么两个equals 会有不同的值 已经提示了
    */
    BigDecimal bigC = new BigDecimal(1.2);
    BigDecimal bigE = new BigDecimal(1.20000000);
    boolean equals = bigE.equals(bigC);
    //true
    System.out.println(bigE.equals(bigC));
    System.out.println(bigE.compareTo(bigC));
    BigDecimal z1 = new BigDecimal("0");
    BigDecimal z2 = new BigDecimal("0.0");
    //false
    System.out.println(z1.equals(z2));
    System.out.println(z1.compareTo(z2));


    //两数 取最大
    BigDecimal max = bigD.max(bigC);

    //两数 取最小
    BigDecimal min = bigD.min(bigC);
    //n次幂 4
    BigDecimal pow = bigD.pow(2);

    // 四舍五入 2.345 -> 2.3 round=2.3
    BigDecimal bigF = new BigDecimal(2.345);
    MathContext math = new MathContext(2);
    BigDecimal round = bigF.round(math);

    //绝对值 -23 -> 23
    BigDecimal bigG = new BigDecimal("-23");
    BigDecimal abs = bigG.abs();


    /**
    * movePointLeft 小数点左移
    * movePointRight 小数点右移
    */
    BigDecimal bigH = new BigDecimal("23.4567");
    BigDecimal bigDecimal = bigH.movePointLeft(1);
    BigDecimal bigDecimal1 = bigH.movePointRight(1);

    /**
    * 取反 23.4567 -> -23.4567
    */
    BigDecimal negate = bigH.negate();

    /**
    * 跟round 一样 底层都是plus
    */
    MathContext math1 = new MathContext(3);
    BigDecimal plus = bigH.plus(math1);
    System.out.println(plus);

    /**
    * ulp
    * 返回最后一位的位置 都是1
    * 231212 -> 1
    * 2.31212 -> 0.00001
    */
    BigDecimal bigK = new BigDecimal("231212");
    BigDecimal bigO = new BigDecimal("2.31212");
    BigDecimal ulp = bigO.ulp();
    System.out.println(ulp);


    /**
    * 6 转换
    */
    BigDecimal bigP = new BigDecimal("2312");
    bigP.doubleValue();
    bigP.longValue();
    bigP.intValue();
    bigP.byteValue();
    bigP.shortValue();
    bigP.byteValue();
    /**
    * toString 数字过长 会采用 科学计数法
    * toPlainString 这个正常显示
    */
    bigP.toString();
    bigP.toPlainString();
    }
  • 相关阅读:
    [BZOJ3172]单词
    [BZOJ2434]阿狸的打字机
    [BZOJ1195]最短母串
    [codeforces743E]Vladik and cards
    [BZOJ2553]禁忌
    [BZOJ1009]GT考试
    [BZOJ3507]通配符匹配
    [BZOJ4027]兔子与樱花
    test20190308
    Luogu P2742 模板-二维凸包
  • 原文地址:https://www.cnblogs.com/zq1003/p/15184513.html
Copyright © 2011-2022 走看看