【Java】工具篇(2):BigDecimal的使用和总结

大家好,我是皮皮猫吖!

每文一言:你一定可以成为你想成为的人。


本篇文章:

在做一些Java相关的算法题的时候,会经常使用到浮点类型数据的相关操作。但是,在Java中使用float、double又容易丢失精度,让人非常的头疼。

但是,Java为了解决精度问题,给我们提供了更好的浮点型数据的运算解决办法。BigDecimal类就是用来对浮点型数据进行计算的,既可以进行大浮点型数据的计算,还可以解决丢失精度的问题。开始学习BigDecimal这个类。写下这篇文章,作为学习BigDecimal的总结。

正文如下:

一、创建BigDecimal类型的数据

① 使用nextBigDecimal、构造器创建

注意:

1)使用构造器创建BigDecimal类型的数据的时候,直接传入Double类型的数据的话,会存在错误。

2)使用构造器创建BigDecimal类型的数据的时候,使用String类型的数据进行创建

3)使用BigDecimal.valueOf():也可以创建double类型的数据

    //创建BigDecimal类型的数据:
    @Test
    public void test1(){
        BigDecimal data1;
        Scanner scanner = new Scanner(System.in);
        //1.通过nextBigDecimal创建BigDecimal类型的数据
//        data1 = scanner.nextBigDecimal();
//        System.out.println(data1);

        //2.通过构造函数创建:建议转换成String进行创建
        data1 = new BigDecimal("12.345");
        System.out.println(data1);

        data1 = new BigDecimal("12");
        System.out.println(data1);

        //使用浮点型数据创建BigDecimal类型的数据,数据有问题
        data1 = new BigDecimal(12.345);
        //数据有问题
        System.out.println(data1);

        //数据不存在问题
        data1 = new BigDecimal("12.345");
        System.out.println(data1);

        data1 = new BigDecimal(123);
        System.out.println(data1);

        //创建double类型的数据
        data1= BigDecimal.valueOf(12.345);
        System.out.println(data1);
    }

二、BigDecimal类型数据的常用运算方法:加、减、乘、除【特殊】

① 加法: BigDecimal add(BigDecimal augend)

返回一个BigDecimal类型的数据,其值为 (this + augend),其标度【标度是小数点后的位数】为 max(this.scale(), augend.scale())。

② 减法: BigDecimal subtract(BigDecimal subtrahend)

返回一个BigDecimal类型的数据,其值为 (this - subtrahend),其标度为 max(this.scale(), subtrahend.scale())。

③ 乘法: BigDecimal multiply(BigDecimal multiplicand)

返回一个BigDecimal类型的数据,其值为 (this × multiplicand),其标度为 (this.scale() + multiplicand.scale())。

④ 除法: BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)

返回一个BigDecimal类型数据,其值为 (this / divisor),其标度为指定标度,取值类型小数点四舍五入

参数1:除数

参数2:标度【保留小数点的位数】

参数3:舍入的方式

 //BigDecimal类型的数据的加减乘除方法
    @Test
    public void test2(){
        BigDecimal data1 = new BigDecimal("123.2");
        BigDecimal data2 = new BigDecimal("17");
        BigDecimal temp;

        //加法
        temp = data1.add(data2);
        System.out.println(temp);

        //减法
        temp = data1.subtract(data2);
        System.out.println(temp);

        //乘法
        temp = data1.multiply(data2);
        System.out.println(temp);

        
        //除法:后面一定需要带上精度和输入模式
        //BigDecimal.ROUND_HALF_UP:四舍五入
      	//四舍五入到小数点第四位
        temp = data1.divide(data2,4,BigDecimal.ROUND_HALF_UP);
        System.out.println(temp);
        temp = data1.divide(data2,5, RoundingMode.HALF_UP);
        System.out.println(temp);
    }

三、比较大小

① 比较大小: int compareTo(BigDecimal val)

将此 BigDecimal 与指定的 BigDecimal 比较。

返回1:调用的数大;等于0,两者相等;等于-1,val值大

    //比较BidDecimal类型数据的大小
    @Test
    public void test3(){
        BigDecimal data1 = new BigDecimal("123.345");
        BigDecimal data2 = new BigDecimal("13.345");

        System.out.println(data1.compareTo(data2));
        System.out.println(data2.compareTo(data1));
    }

四、舍位计算【保留几位小数】

① 舍位计算: BigDecimal setScale(int newScale, RoundingMode roundingMode)

返回 BigDecimal,其标度为指定值,其非标度值通过此 BigDecimal 的非标度值乘以或除以十的适当次幂来确定,以维护其总值。

参数1:标度,精确的位数

参数2:舍入模式

    //舍入计算
    @Test
    public void test4(){
        BigDecimal data1 = new BigDecimal("12.345123");

        //向上舍入:12.35
        System.out.println(data1.setScale(2,BigDecimal.ROUND_UP));
        //向下舍入:12.34
        System.out.println(data1.setScale(2,BigDecimal.ROUND_DOWN));
        //四舍五入:12.34
        System.out.println(data1.setScale(2,BigDecimal.ROUND_HALF_UP));

        System.out.println("-------------------------------");
        
        BigDecimal data2 = new BigDecimal("12.345");
        //ROUND_HALF_DOWN:当要舍入的位数的后面的数为5【只有5】的时候,五舍六入;当要舍入的位数的之后的数为5xxxx的时候,向上舍入【靠近大的值】
        System.out.println(data2.setScale(2,BigDecimal.ROUND_HALF_DOWN));
        System.out.println(data1.setScale(2,BigDecimal.ROUND_HALF_DOWN));
    }

五、格式化

    //格式化数据
    @Test
    public void test5(){
        //创建货币格式引用
        NumberFormat currency = NumberFormat.getCurrencyInstance();
        //创建百分比引用
        NumberFormat percent = NumberFormat.getPercentInstance();
        //设置百分比小数点最多三位
        percent.setMaximumFractionDigits(3);

        //金额
        BigDecimal data1 = new BigDecimal("116.7");
        //利率
        BigDecimal data2 = new BigDecimal("0.0223");
        //利息
        BigDecimal data3 = data1.multiply(data2);

        //转化为带¥格式的数据
        System.out.println(currency.format(data1));
        //转化为百分比格式的数据
        System.out.println(percent.format(data2));
        //转化为带¥格式的数据
        System.out.println(currency.format(data3));

        //自定义格式
        DecimalFormat df = new DecimalFormat();
        double data = 12.345;
        String style = "0.0";
        //设置格式为style类型的格式
        df.applyPattern(style);
        System.out.println(df.format(data));
    }

六、科学计数

① 将Excel格式的数据转换为十进制类型数据: String toPlainString()

返回不带指数字段的此BigDecimal的字符串表示形式。

    //将Excel类型的数据转换为十进制类型的数据
    @Test
    public void test6(){
        BigDecimal data = new BigDecimal("3.1415926E10");
        String result = data.toPlainString();
        System.out.println(result);
    }

六、小结

上面就是关于BigDecimal类的一些常用的使用方法的总结。

① 使用BigDecimal进行小数点保留还是非常实用的,需要牢牢记住。

② 使用BigDecimal进行除法的时候,一定要有标度【保留几位】,否则会报异常

③ 精确计算,选择BigDecimal


参考文章:

Java中BigDecimal类的使用方法详解,常用最全系列!


希望本篇文章对大家有所帮助,后续会继续分享java数据结构与算法相关学习知识…

如果文章内容有错误的地方,请在留言处留下你的见解,方便大家共同学习。谢谢!

如有侵权或其他任何问题请联系:QQ1370922071,本文主要用于学习交流,转载请声明!

作者:皮皮猫吖


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值