Java常用API -- BigDecimal类的用法和注意事项

1. BigDecimal


1.1 BigDecimal 的用处: 用于解决小数运算中, 出现的不精确问题

《阿里巴巴Java开发手册》中提到:

浮点数之间的等值判断,对于基本数据类型(floatdouble)不能用==来比较,包装数据类型(FloatDouble)不能用 equals 来判断。 具体原理和浮点数的编码方式有关,这里就不多提了,我们下面直接上实例:

        Float a = 1.0f - 0.9f;
        Float b = 0.9f - 0.8f;
        System.out.println(a);// 0.100000024
        System.out.println(b);// 0.099999964
        System.out.println(a.equals(b));// false

        float a1 = 1.0f - 0.9f;
        float b1 = 0.9f - 0.8f;
        System.out.println(a1);// 0.100000024
        System.out.println(b1);// 0.099999964
        System.out.println(a1 == b1);// false

结果:
在这里插入图片描述

具有基本数学知识的我们很清楚的知道输出并不是我们想要的结果(由于计算机底层精度丢失),我们如何解决这个问题呢?一种很常用的方法是:使用 BigDecimal 来定义浮点数的值,再进行浮点数的运算操作。

示例:

        BigDecimal a = new BigDecimal("1.0");
        BigDecimal b = new BigDecimal("0.9");
        BigDecimal c = new BigDecimal("0.8");
        BigDecimal x = a.subtract(b);// 0.1
        BigDecimal y = b.subtract(c);// 0.1
        System.out.println(x.equals(y));// true

结果:

在这里插入图片描述


1.2 BigDecimal 常用方法

在这里插入图片描述

divide方法可以设置保留几位小数,并控制舍入模式
在这里插入图片描述

示例:
在这里插入图片描述

补充:compareTo方法可以用于比较大小:

a.compareTo(b) : 返回 -1 表示小于,0 表示 等于, 1表示 大于。

示例:

        BigDecimal a = new BigDecimal("1.0");
        BigDecimal b = new BigDecimal("0.9");
        BigDecimal c = new BigDecimal("0.1");
        System.out.println(a.compareTo(b));// 1
        System.out.println(a.subtract(b).compareTo(c));// 0

结果:
在这里插入图片描述


1.3 BigDecimal 保留几位小数

通过 setScale方法设置保留几位小数以及保留规则。保留规则有挺多种(我这里采用的是四舍五入),不需要记,IDEA会提示。
在这里插入图片描述

    public static void main(String[] args) {
        BigDecimal m = new BigDecimal("1.255433");
        BigDecimal n = m.setScale(3, BigDecimal.ROUND_HALF_UP);
        System.out.println(n);// 1.255

        BigDecimal m1 = new BigDecimal("1.255533");
        BigDecimal n1 = m1.setScale(3, BigDecimal.ROUND_HALF_UP);
        System.out.println(n1);// 1.255
    }

结果:
在这里插入图片描述

补充:如何对BigDecimal计算后的结果

使用 DecimalFormat 可以对 double 类型的数据进行格式化
在这里插入图片描述


1.4 BigDecimal 的使用注意事项

注意:我们在使用BigDecimal时,为了防止精度丢失,推荐使用它的 BigDecimal(String) 构造方法来创建对象。《阿里巴巴Java开发手册》对这部分内容也有提到如下图所示。
在这里插入图片描述

说明:

BigDecimal 类有 3 种构造方法:
在这里插入图片描述

但是第一种构造方法可能会造成精度丢失,不推荐使用:
在这里插入图片描述


1.5 BigDecimal的使用总结

  • BigDecimal 主要用来操作(大)浮点数,BigInteger 主要用来操作大整数(超过 long 类型)。
  • BigDecimal 的实现利用到了 BigInteger, 所不同的是 BigDecimal 加入了小数位的概念。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

CodeJiao

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值