常用API之BigDecimal类的使用(学习Java第16天)

目录

BigDecimal类的概述

BigDecimal类构造方法

BigDecimal类常用方法

除法保留三位小数代码实例

除法保留三位有效数字代码实例 

乘法保留两位小数

乘法保留两位有效数字



BigDecimal类的概述

使用基本类型做浮点数运算精度问题

看程序说结果:

public static void main(String[] args) {
      // 小数运算精度问题:
      System.out.println(0.09 + 0.01);
    //  期望:0.10    很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
      System.out.println(1.0 - 0.32);
    //   期望:0.68    很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
     System.out.println(1.015 * 100);
    //  期望:101.5    很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
     System.out.println(1.301 / 100);
    //  期望:0.01301    很遗憾,结果并不是期望值,而是一个无限趋近期望值的小数
}
  • 对于浮点运算,不要使用基本类型,而使用"BigDecimal类"类型

  • java.math.BigDecimal(类):提供了更加精准的数据计算方式。

BigDecimal类构造方法

 注意:推荐使用第二种方式,第一种存在精度问题

    // 构造方法
    private static void method01() {
        // 创建BigDecimal对象
        BigDecimal b1 = new BigDecimal("0.09");
        BigDecimal b2 = new BigDecimal("0.01");

        System.out.println(b1.add(b2));//  0.10 没有精度问题

        // 创建BigDecimal对象
        // BigDecimal b1 = new BigDecimal(0.09);
        // BigDecimal b2 = new BigDecimal(0.01);

        // 由此可发现使用BigDecimal(double val)创建出来的对象,发生数学运算还是有精度问题
        // System.out.println(b1.add(b2));
        // 0.09999999999999999687749774324174723005853593349456787109375
    }

BigDecimal类常用方法

BigDecimal类中使用最多的还是提供的进行四则运算的方法,如下:

 注意:对于divide方法来说,如果除不尽的话,就会出现java.lang.ArithmeticException异常。此时可以使用divide方法的另一个重载方法;

BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode): divisor:除数对应的BigDecimal对象;scale:精确的位数;roundingMode取舍模式

 RoundingMode枚举: RoundingMode.HALF_UP 四舍五入

public class Test {
    public static void main(String[] args) {
        // 加法:
        // 创建BigDecimal对象
        BigDecimal b1 = new BigDecimal("0.09");
        BigDecimal b2 = new BigDecimal("0.01");

        BigDecimal res1 = b1.add(b2);
        System.out.println(res1);// 0.10

        System.out.println("===========================");

        // 减法:
        // 创建BigDecimal对象
        BigDecimal b3 = new BigDecimal("1.0");
        BigDecimal b4 = new BigDecimal("0.32");

        BigDecimal res2 = b3.subtract(b4);
        System.out.println(res2);// 0.68

        System.out.println("===========================");

        // 乘法:
        // 创建BigDecimal对象
        BigDecimal b5 = new BigDecimal("1.015");
        BigDecimal b6 = new BigDecimal("100");

        BigDecimal res3 = b5.multiply(b6);
        System.out.println(res3);// 101.500

        System.out.println("===========================");

        // 除法:
        // 创建BigDecimal对象
        BigDecimal b7 = new BigDecimal("1.301");
        BigDecimal b8 = new BigDecimal("100");

        BigDecimal res4 = b7.divide(b8);
        System.out.println(res4);// 0.01301
    }
}


// BigDecimal类的注意事项:
public class Test2 {
    public static void main(String[] args) {
        // 创建BigDecimal对象
        BigDecimal b1 = new BigDecimal("10");
        BigDecimal b2 = new BigDecimal("3");

        //BigDecimal res = b1.divide(b2);// 报ArithmeticException运算异常
        BigDecimal res = b1.divide(b2, 2, RoundingMode.HALF_UP);
        System.out.println(res);// 3.33
    }
}

除法保留三位小数代码实例

        BigDecimal b1=new BigDecimal("1.302");
       BigDecimal b2=new BigDecimal("0.013");


        //保留三位小数             
        BigDecimal divide = b1.divide(b2, 3, BigDecimal.ROUND_HALF_UP);
        System.out.println(divide);

除法保留三位有效数字代码实例 

BigDecimal divide1 = b1.divide(b2, new MathContext(3));
        System.out.println(divide1);


乘法保留两位小数

        BigDecimal b1 = new BigDecimal("12.221");
        BigDecimal b2 = new BigDecimal("1.21");
        BigDecimal m1 = b1.multiply(b2);
        BigDecimal bigDecimal1 = m1.setScale(2, RoundingMode.HALF_UP);
        System.out.println(bigDecimal1);

乘法保留两位有效数字

        System.out.println(b1.multiply(b2, new MathContext(2)));

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值