浅谈Java中BigDecimal类的简单应用

 更新时间:2023年07月04日 09:25:54   作者:长安明月  
这篇文章主要介绍了浅谈Java中BigDecimal类的简单应用,BigDecimal是由任意精度的整数非标度值和32位的整数标度组成,如果为零或正数,则标度是小数点后的位数,如果为负数,则将该数的非标度值乘以 10的负scale次幂,需要的朋友可以参考下

一、BigDecimal 类简介

因为计算机无法精确表示浮点数,所以在进行数字运算时,如果有 double 或 float 类型的浮点数参与计算,容易出现计算不准确的情况。在一些对精度要求很高的系统中,需要使用 BigDecimal 类来进行精确运行。

二、创建 BigDecimal 对象的方式

2.1 使用构造方法创建对象

使用构造器方法创建对象,有多种不同的入参,常见的方法如下:

  • BigDecimal(String val)
  • BigDecimal(double val) (备注:不推荐,容易丢精度)

2.2 使用静态方法创建对象

BigDecimal 有多种静态方法可以创建对象,常见的几种方法如下所示:

  • public static BigDecimal valueOf(double val)
  • public static BigDecimal valueOf(long val)
  • public static BigDecimal valueOf(long unscaledVal, int scale)

以上几种创建 BigDecimal 的 demo 如下所示。

public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("123.092");
        System.out.println(num1);
        // 123.092
        // 不推荐此种方法
        BigDecimal num2 = new BigDecimal(123.092);
        System.out.println(num2);
        // 123.0919999999999987494447850622236728668212890625
        BigDecimal num3 = BigDecimal.valueOf(1234.5678);
        System.out.println(num3);
        // 1234.5678
        long num4 = 1234;
        BigDecimal num5 = BigDecimal.valueOf(num4);
        System.out.println(num5);
        // 1234
        BigDecimal num6 = BigDecimal.valueOf(num4, 3);
        System.out.println(num6);
        // 1.234
    }

三、BigDecimal 类的常用方法

BigDecimal 几种常见计算方法如下所示。

操作方法函数
加法public BigDecimal add(BigDecimal augend)
减法public BigDecimal subtract(BigDecimal subtrahend)
乘法public BigDecimal multiply(BigDecimal multiplicand)
除法(限定能除尽的情况,如果除不尽会抛出异常java.lang.ArithmeticException)public BigDecimal divide(BigDecimal divisor)
除法(可设置相除结果保留精度,无论是否可以除尽,都可以用该方法设置精度)public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
求余public BigDecimal remainder(BigDecimal divisor)
求相反数public BigDecimal negate()

以上几种操作方法的 demo 如下所示。

四、设置精度(保留小数位)

BigDecimal 有多种方法可以设置精度(即设置几位小数)。分述如下。

4.1 DecimalFormat 设置格式

可以通过 DecimalFormat 设置保留的格式,demo 如下所示。如何编写 DecimalFormat,可以参考网上的介绍,此处不做介绍。

    public static void main(String[] args) {
        // 格式化两位有效数字(四舍五入)
        DecimalFormat df = new DecimalFormat("0.00");
        double num1 = 0.145926;
        System.out.println(df.format(num1));
        // 0.15
    }

4.2 BigDecimal setScale(int newScale) 方法设置精度

可以调用 BigDecimal 的 setScale(int newScale) 方法来设置精度,其中传入参数即保留的小数位数。该方法要求请求的操作具有精确的结果,否则会抛出 ArithmeticException。

public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1234");
        BigDecimal num2 = num1.setScale(1);
        System.out.println(num2);
        // 1234.0
        BigDecimal num3 = new BigDecimal("1234.45");
        BigDecimal num4 = num3.setScale(1);
        System.out.println(num4);
        // 此处抛出异常:java.lang.ArithmeticException: Rounding necessary
    }

4.3 调用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法

通过调用 BigDecimal 的 setScale(int newScale, int roundingMode) 方法,传入保留的小数位数 newScale 以及舍入模式 roundingMode(Java BigDecimal 的舍入模式(RoundingMode)详解),可以实现精度设置,demo 如下所示。

public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1234.455");
        BigDecimal num2 = num1.setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(num2);
        // 1234.46
        System.out.println(num2.doubleValue());
        // 1234.46
    }

五、常用乘除法(设置精度)

5.1 乘法

public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("1.45");
        BigDecimal num2 = new BigDecimal("2.625");
        BigDecimal ans = num1.multiply(num2).setScale(2, BigDecimal.ROUND_HALF_UP);
        System.out.println(ans);
        // 3.81
        System.out.println(ans.doubleValue());
        // 3.81
        System.out.println(ans.intValue());
        // 3
    }

5.2 除法

public static void main(String[] args) {
        BigDecimal num1 = new BigDecimal("10.45");
        BigDecimal num2 = new BigDecimal("2.625");
        BigDecimal ans = num1.divide(num2, 2, BigDecimal.ROUND_HALF_UP);
        System.out.println(ans);
        // 3.98
        System.out.println(ans.doubleValue());
        // 3.98
        System.out.println(ans.intValue());
        // 3
    }

到此这篇关于浅谈Java中BigDecimal类的简单应用的文章就介绍到这了,更多相关Java的BigDecimal类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • 如何在Spring data中使用r2dbc详解

    如何在Spring data中使用r2dbc详解

    这篇文章主要给大家介绍了关于如何在Spring data中使用r2dbc的相关资料,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-11-11
  • 深入理解Java并发编程之LinkedBlockingQueue队列

    深入理解Java并发编程之LinkedBlockingQueue队列

    本文主要介绍了Java并发编程之LinkedBlockingQueue队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-04-04
  • SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

    SpringBoot项目启动报错"找不到或无法加载主类"的解决方法

    在使用 IntelliJ IDEA 开发基于 Spring Boot 框架的 Java 程序时,可能会出现找不到或无法加载主类 com.example.springboot.SpringbootApplication的错误提示,下面我们来看看如何解决吧
    2025-03-03
  • 一文掌握Java 数据结构超详细笔记(收藏版)

    一文掌握Java 数据结构超详细笔记(收藏版)

    本文给大家介绍Java数据结构,包括数组、链表、List、Set、Map及迭代器,对比了其内存特性、操作效率和应用场景,并介绍了哈希及冲突解决方法,感兴趣的朋友跟随小编一起看看吧
    2025-09-09
  • java实现文件夹解压和压缩

    java实现文件夹解压和压缩

    这篇文章主要为大家详细介绍了java实现文件夹解压和压缩,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2020-03-03
  • springdata jpa单表操作crud的实例代码详解

    springdata jpa单表操作crud的实例代码详解

    这篇文章主要介绍了springdata jpa单表操作crud的实例代码详解,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-01-01
  • 详细易懂带你了解Spring中的注解

    详细易懂带你了解Spring中的注解

    这篇文章主要介绍了详细易懂带你了解Spring中的注解,Spring的一个核心是IOC,是将Bean初始化加载到容器中,Bean是如何加载到容器的,可以使用Spring注解方式或者Spring XML配置方式,需要的朋友可以参考下
    2023-08-08
  • Java设计模式模板方法模式(Template)用法解析

    Java设计模式模板方法模式(Template)用法解析

    这篇文章主要介绍了Java设计模式模板方法模式(Template)用法解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-11-11
  • java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法

    java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list

    这篇文章主要介绍了java.lang.NoSuchMethodException: com.sun.proxy.$Proxy58.list错误解决办法的相关资料,需要的朋友可以参考下
    2016-12-12
  • Idea设置全局highlighting level为Syntax问题

    Idea设置全局highlighting level为Syntax问题

    这篇文章主要介绍了Idea设置全局highlighting level为Syntax问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-04-04

最新评论