java

关注公众号 jb51net

关闭
首页 > 软件编程 > java > Java的BigDecimal类

浅谈Java中BigDecimal类的简单应用

作者:长安明月

这篇文章主要介绍了浅谈Java中BigDecimal类的简单应用,BigDecimal是由任意精度的整数非标度值和32位的整数标度组成,如果为零或正数,则标度是小数点后的位数,如果为负数,则将该数的非标度值乘以 10的负scale次幂,需要的朋友可以参考下

一、BigDecimal 类简介

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

二、创建 BigDecimal 对象的方式

2.1 使用构造方法创建对象

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

2.2 使用静态方法创建对象

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

以上几种创建 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类内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

您可能感兴趣的文章:
阅读全文