# 记录一下BigDecimal的常用方法,加、减、乘、除、比较。


前言

针对一些企业级的开发和计算,double或者float的精度会造成数据的丢失,因此一般会用BigDecimal这个类来进行浮点计算。并且BigDecimal也对应了MYSQL中decimal类型。也算比较常见。


提示:以下是本人自学的代码,如有错误还请改正。

一、初始化

因为BigDecimal是引用类型,所以不能直接用=幅值。

        //String参数的构造方法
        BigDecimal b1 = new BigDecimal("75.00");//75.00
        BigDecimal b2 = new BigDecimal("1.5");//1.5


        //静态方法valueOf
        BigDecimal b3 = BigDecimal.valueOf(75.00);//75.0
        BigDecimal b4 = BigDecimal.valueOf(1.5);//1.5

        /*
        注意:这里不建议使用double参数的构造,因为double会造成精度丢失
         */
        BigDecimal b5 = new BigDecimal(75.01);//75.0100000000000051159076974727213382720947265625
        BigDecimal b6 = new BigDecimal(1.1);//1.100000000000000088817841970012523233890533447265625

二、常用api

加 + add()

        //加法        小数位以长的为准
        System.out.println(BigDecimal.valueOf(25.04).add(BigDecimal.valueOf(75.69)));//100.73

减 - subtract()

        //减法        小数位以长的为准
        System.out.println(BigDecimal.valueOf(25.04).subtract(BigDecimal.valueOf(75.69)));//-50.65

乘 * multiply()

        //乘法        小数位=两数小数位之和
        System.out.println(BigDecimal.valueOf(25.04).multiply(BigDecimal.valueOf(75.69)));//1895.2776

除 / divide()

        //除法        除法必须指定小数位数(规范)不然精度会丢失
        /*
        进位枚举类:
                ROUND_CEILING:舍位时往正无穷方向移动
                正数:1.1 -> 2   1.5-> 2   1.8-> 2
                负数:-1.1-> -1   -1.5-> -1   -1.8-> -1

                ROUND_DOWN:向0的方向移动
                正数:1.1-> 1   1.5-> 1   1.8-> 1
                负数:-1.1-> -1   -1.5-> -1   -1.8> -1

                ROUND_FLOOR:与CEILING相反,往负无穷
                正数: 1.1-> 1   1.5-> 1   1.8-> 1
                负数: -1.1-> -2   -1.5-> -2   -1.8-> -2

                ROUND_HALF_DOWN:以5为分界线,或曰五舍六入
                正数:1.5-> 1   1.6-> 2
                负数:-1.5-> -1   -1.6-> -2

                ROUND_HALF_EVEN:同样以5为分界线,如果是5,则前一位变偶数
                1.15-> 1.2   1.16-> 1.2   1.25-> 1.2   1.26-> 1.3

                ROUND_HALF_UP:最常见的四舍五入

                ROUND_UNNECESSARY:无需舍位

                ROUND_UP与ROUND_DOWN相反,远离0的方向
                正数:1.1-> 2   1.5-> 2   1.8-> 2
                负数:-1.1-> -2   -1.5-> -2   -1.8-> -2
         */
        System.out.println("四舍五入保存4为小数的  75.00/ 2.0 : "+b1.divide(BigDecimal.valueOf(2.0),4,BigDecimal.ROUND_HALF_UP));//37.5000

截断 setScale()

  /*
            截断,保留几位小数

            ROUND_CEILING    //向正无穷方向舍入
            ROUND_DOWN    //向零方向舍入
            ROUND_FLOOR    //向负无穷方向舍入
            ROUND_HALF_DOWN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
            ROUND_HALF_EVEN    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
            ROUND_HALF_UP    //向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6,也就是我们常说的“四舍五入”
            ROUND_UNNECESSARY    //计算结果是精确的,不需要舍入模式
            ROUND_UP    //向远离0的方向舍入


         */
        System.out.println("12.98576截断,保留2位小数 : "+BigDecimal.valueOf(12.98576).setScale(2, RoundingMode.HALF_UP));//12.99

        System.out.println("显示小数位数的: "+b1.scale()); //2

BigDecimal比较大小 compareTo()

/*
        BigDecimal比较大小是通过compareTo比较器比较
         */

        System.out.println("前 10  < 后 5 : " + (BigDecimal.valueOf(10).compareTo(BigDecimal.valueOf(5)) < 0));//false
        System.out.println("前 10  > 后 5 : " + (BigDecimal.valueOf(10).compareTo(BigDecimal.valueOf(5)) > 0));//true
        System.out.println("前 10 = 后 10 : " + (BigDecimal.valueOf(10).compareTo(BigDecimal.valueOf(10)) == 0));//true

获取方法value()

        System.out.println("返回double值"+BigDecimal.valueOf(15.15).doubleValue());
        System.out.println("返回float值"+BigDecimal.valueOf(15.15).floatValue());
        System.out.println("返回int值"+BigDecimal.valueOf(15.15).intValue());
        System.out.println("返回BigInteger值"+BigDecimal.valueOf(15.15).unscaledValue());

        System.out.println("返回short值"+BigDecimal.valueOf(15.15).shortValue());
        //,如果没有小数位并且在short取值范围内返回,否则抛出异常 :java.lang.ArithmeticException
        System.out.println("返回short值并检查"+BigDecimal.valueOf(15.15).shortValueExact());

        System.out.println("返回long值"+BigDecimal.valueOf(15.15).longValue());
        //如果没有小数位并且在long取值范围内返回,否则抛出异常 :java.lang.ArithmeticException
        System.out.println("返回long值"+BigDecimal.valueOf(15.15).longValueExact());

        System.out.println("返回byte值"+BigDecimal.valueOf(15.15).byteValue());
        //如果没有小数位并且在byte取值范围内返回,否则抛出异常 :java.lang.ArithmeticException
        System.out.println("返回byte值"+BigDecimal.valueOf(15.15).byteValueExact());


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值