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;

 

BigDecimal 方法使用

 

 

2 加减乘除

BigDecimal 方法使用

 

 

       /**
         * 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 向上取整

BigDecimal 方法使用

 

   

  3.2 ROUND_DOWN 向下取整

BigDecimal 方法使用

 

 

  3.3 ROUND_HALF_UP  四舍五入

BigDecimal 方法使用

 

 

  3.4ROUND_HALF_DOWN 五舍六入

BigDecimal 方法使用

 

 

  3.5 ROUND_FLOOR 负无穷

BigDecimal 方法使用

 

 

  3.6 ROUND_CEILING 正无穷

BigDecimal 方法使用

 

 

  3.7 ROUND_HALF_EVEN  银行家舎入法

BigDecimal 方法使用

 

 

3.8 ROUND_UNNECESSARY 不需要舎入

BigDecimal 方法使用

 

 

4 组合使用

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

BigDecimal 方法使用

 

 

 

摘:测试代码

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);
        System.out.println(add1);
    }

 

上一篇:分解质数相乘——记一次有技术含量的笔试骗A


下一篇:二叉搜索树中最接近的值——lintcode900