BigDecimal精确算数类的最全操作手册,建议收藏!!(加减乘除,类型转换,取小数点,比较大小)

前言

我们都知道,在正常的商业计算使用中,采用Double和float类型进行精确计算是不可取的,会存在很多意想不到的错误,因此BigDecimal诞生了。BigDecimal除了有更高的精度之外,还可以创建一个更大的数。比如:int 的最大值是:2147483647,如果在想大的话就要用到BigDecimal了。

废话不多说了,下面是使用方法。

加减乘除

 		BigDecimal bignum1 = new BigDecimal("100");
        BigDecimal bignum2 = new BigDecimal("20");
        BigDecimal bignum3;
        //加法
        bignum3 =  bignum1.add(bignum2);
        System.out.println("加法:" + bignum3);
        //减法
        bignum3 = bignum1.subtract(bignum2);
        System.out.println("减法:" + bignum3);
        //乘法
        bignum3 = bignum1.multiply(bignum2);
        System.out.println("乘法:" + bignum3);
        //除法
        bignum3 = bignum1.divide(bignum2);
        System.out.println("除法:" + bignum3);

打印结果:

在这里插入图片描述

转Double、String、Integer

		BigDecimal stringBigDecimal = new BigDecimal("3.1415926");
        BigDecimal intBigDecimal = new BigDecimal("2190");
        BigDecimal doubleBigDecimal = new BigDecimal("3.1415926");
        //转换成 string数据类型
        String stringValue=stringBigDecimal.toString();
        System.out.println("转换成 string数据类型:"+stringValue);
        //转换成 int数据类型
        Integer intValue=intBigDecimal.intValue();
        System.out.println("转换成 int数据类型:"+intValue);
        //转换成 double数据类型
        Double doubleValue=doubleBigDecimal.doubleValue();
        System.out.println("转换成 double数据类型:"+doubleValue);

打印结果:

在这里插入图片描述

保留小数点后两位

这里我举两种最常用的类型:四舍五入法直接删除法

		double d=3.1495926;
        String dValue=Double.toString(d);
        BigDecimal bg = new BigDecimal(dValue);
        //四舍五入法保留两位小数
        double d1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println(d1);
        //直接删除法保留两位小数 不考虑四舍五入,直接删除掉后面的数字
        double d2 = bg.setScale(2, BigDecimal.ROUND_DOWN).doubleValue();
        System.out.println(d2);

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

这里有一个问题,上面两种方法是不会自动填充0的,比如3.1在保留两位小数后还是3.1并不会是3.10,所以我们还需要加入一步操作。

		double d=3.1;
        String dValue=Double.toString(d);
        BigDecimal bg = new BigDecimal(dValue);
        //未补0的情况
        double d1 = bg.setScale(2, BigDecimal.ROUND_HALF_UP).doubleValue();
        System.out.println("未补0的情况:"+d1);
        // 补0的情况   不足两位小数补0
        DecimalFormat decimalFormat = new DecimalFormat("0.00#");
        String d2 = decimalFormat.format(bg);
        System.out.println("补0的情况:"+d2);

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

比较大小

BigDecimal是通过使用compareTo(BigDecimal)来比较大小的。返回值有三种情况

1 :大于
0 :等于
-1 :小于

示例:

		BigDecimal a = new BigDecimal("1");
        BigDecimal b = new BigDecimal("2");
        BigDecimal c = new BigDecimal("1");

        int result1 = a.compareTo(b);
        int result2 = a.compareTo(c);
        int result3 = b.compareTo(a);

        System.out.println(result1);
        System.out.println(result2);
        System.out.println(result3);

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

构造

构造这里还真有点可说的,之前看过一篇博主的文章让我恍然大悟,今天我重新给大家总结一下(厚颜无耻的抄过来☺)

1.public BigDecimal(double val) 将double表示形式转换为BigDecimal *不建议使用

2.public BigDecimal(int val)  将int表示形式转换成BigDecimal

3.public BigDecimal(String val)  将String表示形式转换成BigDecimal

官方比较推荐第三种方法去创建,所以我上面的列子在使用Double转BigDecimal时都会先转换成String在转换成Double。

而为什么不能直接使用double转bigDecimal的原因我举例说明:

		BigDecimal bigDecimal = new BigDecimal(2);
        BigDecimal bDouble = new BigDecimal(2.3);
        BigDecimal bString = new BigDecimal("2.3");
        System.out.println("bigDecimal=" + bigDecimal);
        System.out.println("bDouble=" + bDouble);
        System.out.println("bString=" + bString);

打印结果:
在这里插入图片描述
出现这种情况的原因:

JDK的描述中说:1、参数类型为double的构造方法的结果有一定的不可预知性。有人可能认为在Java中写入newBigDecimal(0.1)所创建的BigDecimal正好等于 0.1(非标度值 1,其标度为 1),但是它实际上等于0.1000000000000000055511151231257827021181583404541015625。这是因为0.1无法准确地表示为 double(或者说对于该情况,不能表示为任何有限长度的二进制小数)。这样,传入到构造方法的值不会正好等于 0.1(虽然表面上等于该值)。

小结

BigDecimal 的使用这里就说完了,当然还有很多没说到的方法大家只能去查看jdk文档了,这里只是列出了最常用的方法,大家可以收藏以备以后使用。另外
BigDecimal 虽好,但不要贪杯哦 BigDecimal 的内存占用比双精度的Double还要大,它由任意精度的整数非标度值 和32 位的整数标度 (scale) 组成,用的太多会出现巨大的内存占用问题。

如果觉得有帮助的话给个免费的点赞吧,Thanks♪(・ω・)ノ

猜你喜欢

转载自blog.csdn.net/jxysgzs/article/details/109214793