• BigDecimal 用法总结


    转载请注明出处:

    1.BigDecimal 简介

      在进行浮点数 long 或 double 类型的运算时,如果直接进行运算,浮点数的运算会出现精度失准的情况,特别是在计算和金额相关的运算时,必须计算精确,不能出现误差,BigDecimal 的出现就是为了解决 浮点数类型的运算精度失准的场景;

      示例:

    复制代码
        public static void main(String[] args) {
            System.out.println(0.2+0.1);
            System.out.println(0.3-0.1);
            System.out.println(0.2*0.1);
            System.out.println(0.3/0.1);
        }
    复制代码

      运行后的结果如下:

                                  

    2.构造BigDecimal的对象

      BigDecimal提供了丰富的构造函数,可以通过int、long、double、String等来构造一个BigDecimal对象。

      但是,使用double作为参数的构造函数,无法精确构造一个BigDecimal对象,需要自己指定一个上下文的环境,也就是指定精确位。

    BigDecimal bg = new BigDecimal(1.1);
    System.out.println(bg.toString());
     
    运行结果:
    1.100000000000000088817841970012523233890533447265625

       所以,通常情况下,我们会使用String对象作为参数来构造一个精确的BigDecimal对象。 下面提供的三种方法都是可以的:

    复制代码
    //方法一
    BigDecimal bg1 = new BigDecimal("1.1");
    //方法二
    BigDecimal bg2 = new BigDecimal(Double.toString(1.1));
    //方法三
    BigDecimal bg3 = BigDecimal.valueOf(1.1);
     
    System.out.println(bg1.toString());
    System.out.println(bg2.toString());
    System.out.println(bg3.toString());
     
    运行结果:
    1.1
    1.1
    1.1
    复制代码

    3.常用方法总结

    • add(BigDecimal): BigDecimal对象中的值相加,返回BigDecimal对象

    • subtract(BigDecimal): BigDecimal对象中的值相减,返回BigDecimal对象

    • multiply(BigDecimal): BigDecimal对象中的值相乘,返回BigDecimal对象

    • divide(BigDecimal): BigDecimal对象中的值相除,返回BigDecimal对象

    • toString(): 将BigDecimal对象中的值转换成字符串

    • doubleValue(): 将BigDecimal对象中的值转换成双精度数

    • floatValue(): 将BigDecimal对象中的值转换成单精度数

    • longValue(): 将BigDecimal对象中的值转换成长整数

    • intValue(): 将BigDecimal对象中的值转换成整数

    • a.max (b) 比较取最大值

    • a.min(b) 比较取最小值

    • a.abs() 取最绝对值

    • negate(): 取相反数

    • (BigDecimal).compareTo(BigDecimal2) : 比较两个BigDecimal 对象的大小; 返回值为-1,表示bigdemical小于bigdemical2; 返回值为 0,表示bigdemical等于bigdemical2; a = 1,表示bigdemical大于bigdemical2;

    4.divide方法使用

      BigDecimal中的divide主要就是用来做除法的运算。 方法定义如下:

    public BigDecimal divide(BigDecimal divisor,int scale, int roundingMode)

      第一个参数是除数,第二个参数代表保留几位小数,第三个代表的是使用的模式。 第三个参数可以使用如下常量配置:

    复制代码
    BigDecimal.ROUND_DOWN:直接省略多余的小数,比如1.28如果保留1位小数,得到的就是1.2
    
    BigDecimal.ROUND_UP:直接进位,比如1.21如果保留1位小数,得到的就是1.3
    
    BigDecimal.ROUND_HALF_UP:四舍五入,2.35保留1位,变成2.4
    
    BigDecimal.ROUND_HALF_DOWN:四舍五入,2.35保留1位,变成2.3
    
    后边两种的区别就是如果保留的位数的后一位如果正好是5的时候,一个舍弃掉,一个进位。
    复制代码

      进行除法运算,并四舍五入

    System.out.println(new BigDecimal("2322").divide(new BigDecimal("209.123345456667"),2, BigDecimal.ROUND_HALF_UP));

      执行结果为 :11.10

    5.setScale 方法使用

      setScale(1)表示保留一位小数,默认用四舍五入方式

    复制代码
    setScale(1)表示保留一位小数,默认用四舍五入方式 
    setScale(1,BigDecimal.ROUND_DOWN)直接删除多余的小数位,如2.35会变成2.3 
    setScale(1,BigDecimal.ROUND_UP)进位处理,2.35变成2.4 
    setScale(1,BigDecimal.ROUND_HALF_UP)四舍五入,2.35变成2.4
    setScaler(1,BigDecimal.ROUND_HALF_DOWN)四舍五入,2.35变成2.3,如果是5则向下舍
    复制代码

      示例:

    复制代码
    double dou = 3.14789;
    //BigDecimal.ROUND_UP 四舍五入
    //BigDecimal.ROUND_DOWN 直接舍弃保留位数之后小数
    BigDecimal bigDecimal = new BigDecimal(dou).setScale(2, BigDecimal.ROUND_DOWN);
    double newDouble = bigDecimal.doubleValue();
    System.out.println("newDouble:" + newDouble);
    复制代码

       注: 1、BigDecimal.ROUND_UP 四舍五入,BigDecimal.ROUND_DOWN 直接舍弃保留位数之后小数; 2、位数不够时,不会补齐

    6.BigDecimal 数据库存储类型对应 decimal

      BigDecimal 数据保存在 Mysql 的时候,可以使用 decimal 的数据库数据类型

      decimal(m,d)

      m是数字的最大位数,他的范围是从1-65;

      d是小数点后的位数,他的范围是0-30,并且不能大于m。

       如果m被省略了,那么m的值默认为10,

       如果d被省略了,那么d的值默认为0.

      举例表示:

        1、decimal(5,2) 所指代的范围是-999.99~999.99 数字的最大位数是5位,小数点右侧是2位,即有两位小数。

        2、decimal(7,6)所指代的范围是-9.999999~9.999999 数字的最大位数是7位,小数点右侧是6位,即有六位小数。

     

     

     

  • 相关阅读:
    开发工具MobaXterm(终极终端)
    高等数学刷题
    如何破解压缩包密码,CTF压缩包处理
    计算机毕业设计ssm+vue基本微信小程序的好物推荐分享系统
    专题一:递归【递归、搜索、回溯】
    python+opencv+深度学习实现二维码识别 计算机竞赛
    导数应用:曲线的凹凸性、渐进线、弧微分与曲率
    聊聊(微服务之SpringCloud+Boot共11章节)看看你会多少?
    PHP 变动:PHP 8 版本下字符串与数值的弱比较
    node安装,nvm管理器
  • 原文地址:https://www.cnblogs.com/zjdxr-up/p/16774249.html