java中大数据运算之BigDecimal精确运算

1. 创建BigDecimal

final BigDecimal bigDecimal = new BigDecimal(0.1); // 0.1000000000000000055511151231257827021181583404541015625

// 推荐这两种方式
final BigDecimal bigDecimal1 = new BigDecimal("0.1"); // 0.1
final BigDecimal bigDecimal2 = BigDecimal.valueOf(0.1);  //0.1    

 

2.  加减乘除

public static void main(String[] args) {
    final BigDecimal numOne = new BigDecimal("0.1"); // 0.1
    final BigDecimal numTwo = BigDecimal.valueOf(0.1);  //0.1

    final BigDecimal add = numOne.add(numTwo);   // 0.2
    System.out.println("add = " + add);

    final BigDecimal subtract = numOne.subtract(numTwo);  // 0.0
    System.out.println("subtract = " + subtract);

    final BigDecimal multiply = numOne.multiply(numTwo);  // 0.01
    System.out.println("multiply = " + multiply);

    final BigDecimal divide = numOne.divide(numTwo);    //1
    System.out.println("divide = " + divide);
}

 

3. 设置小数位

public static void main(String[] args) {
    final BigDecimal numOne = new BigDecimal("0.1"); // 0.1
    final BigDecimal numTwo = BigDecimal.valueOf(0.1);  //0.1

    final BigDecimal add = numOne.add(numTwo).setScale(2,BigDecimal.ROUND_HALF_UP);
    System.out.println("add = " + add);  // 0.20

    final BigDecimal subtract = numOne.subtract(numTwo).setScale(2,BigDecimal.ROUND_HALF_UP);
    System.out.println("subtract = " + subtract); // 0.0

    final BigDecimal multiply = numOne.multiply(numTwo).setScale(3,BigDecimal.ROUND_HALF_UP);   
    System.out.println("multiply = " + multiply);  // 0.010

    final BigDecimal divide = numOne.divide(numTwo).setScale(4,BigDecimal.ROUND_HALF_UP);   
    System.out.println("divide = " + divide);  // 1.0000
}

 

4. 设置进位的方式

public static void main(String[] args) {      
    // 前三种方式是最常用的
    // 四舍五入
    System.out.println("四舍五入 1.145 = " + new BigDecimal("1.145").setScale(2,BigDecimal.ROUND_HALF_UP));

    // 舍入模式,即如果为后面所有数字均为0,则舍去,如果大于0 则进1,  从不减小计算值
    System.out.println("舍入模式 1.140 = " + new BigDecimal("1.140").setScale(2,BigDecimal.ROUND_UP ));
    System.out.println("舍入模式 1.1401 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_UP ));

    // 截断 ,从不增加计算值
    System.out.println("截断模式 1.141 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_DOWN ));


    // ROUND_FLOOR 向负无穷大方向舍入, 即向坐标轴左走
    System.out.println("舍入模式 1.141 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_FLOOR ));
    System.out.println("舍入模式 -1.141 = " + new BigDecimal("-1.141").setScale(2,BigDecimal.ROUND_FLOOR ));

    // ROUND_CEILING 向负无穷大方向舍入, 即向坐标轴右走
    System.out.println("舍入模式 1.141 = " + new BigDecimal("1.141").setScale(2,BigDecimal.ROUND_CEILING ));
    System.out.println("舍入模式 -1.141 = " + new BigDecimal("-1.141").setScale(2,BigDecimal.ROUND_CEILING ));
}

 

5. 两个BigDecimal 数比较

    final BigDecimal bigDecimal = new BigDecimal("11.141").setScale(2, BigDecimal.ROUND_CEILING);
    final BigDecimal bigDecima2 = new BigDecimal("2.141").setScale(2, BigDecimal.ROUND_CEILING);
    final int i = bigDecimal.compareTo(bigDecima2);
    System.out.println("i = " + i);   //  -1 代表前者小,  0 代表相等, 1 代表前者大

 

posted @ 2022-04-10 15:42  得好好活  阅读(193)  评论(0)    收藏  举报