首页 > 技术文章 > BigDecimal 方法使用

zq1003 2021-08-25 12:25 原文

 

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();
}

 

推荐阅读