首页 > 编程笔记 > Java笔记 阅读:17

Java BigInteger和BigDecimal大数据类的用法(附带实例)

在 Java 程序中对货币等大值数据进行计算时,int、long、float 和 double 等基本数据类型在精度方面就不能满足需求了。为此,Java 提供了两个大数字类,分别是 java.math.BigInteger 和 java.math.BigDecimal,这两个类都继承自 java.lang.Number 抽象类,如下图所示。


图 1 大数字类图

Java BigInteger类

java.math.BigInteger 是不可变的任意精度的大整数。其构造方法有很多,其中字符串参数的构造方法有两个:
BigInteger提供多种方法,下面列举几个常用的方法:

方法 功能
BigInteger add(BigInteger val) 加运算,当前对象数字加参数 val。
BigInteger subtract(BigInteger val) 减运算,当前对象数字减参数 val。
BigInteger multiply(BigInteger val) 乘运算,当前对象数字乘参数 val。
BigInteger divide(BigInteger val) 除运算,当前对象数字除以参数 val。

示例代码如下:
import java.math.BigInteger;

public class Main {
    public static void main(String[] args) {
        // 创建 BigInteger 对象
        BigInteger num1 = new BigInteger("123456789012345678901234567890");
        BigInteger num2 = new BigInteger("9876543210987654321098765432210");

        // 执行基本的算术运算
        BigInteger sum = num1.add(num2);
        BigInteger difference = num1.subtract(num2);
        BigInteger product = num1.multiply(num2);
        BigInteger quotient = num1.divide(num2);

        // 显示结果
        System.out.println("数 1:" + num1);
        System.out.println("数 2:" + num2);
        System.out.println("和:" + sum);
        System.out.println("差:" + difference);
        System.out.println("积:" + product);
        System.out.println("商:" + quotient);
    }
}
程序运行结果如下:

数 1:123456789012345678901234567890
数 2:9876543210987654321098765432210
和:111111111101111111101111111111100
差:-864197532086419753208641975320
积:121932631137021795226185032733622923322237463801111263526900
商:0

Java BigDecimal类

java.math.BigDecimal 也是不可变的任意精度的有符号十进制数。其构造方法有很多,如下表所示。

构造方法 功能
BigDecimal(BigInteger val) 将 BigInteger 对象 val 转换为 BigDecimal 对象。
BigDecimal(double val) 将 double 转换为 BigDecimal 对象,参数 val 是 double 类型的二进制浮点值准确的十进制表示形式。
BigDecimal(int val) 将 int 转换为 BigDecimal 对象。
BigDecimal(long val) 将 long 转换为 BigDecimal 对象。
BigDecimal(String val) 将字符串表示数字形式转换为 BigDecimal 对象。

BigDecimal 提供多种方法,下表列举了几个常用的方法。

方法 功能
BigDecimal add(BigDecimal val) 加运算,当前对象数值加参数 val。
BigDecimal subtract(BigDecimal val) 减运算,当前对象数值减参数 val。
BigDecimal multiply(BigDecimal val) 乘运算,当前对象数值乘参数 val。
BigDecimal divide(BigDecimal val) 除运算,当前对象数值除以参数 val。
BigDecimal divide(BigDecimal val, int roundingMode) 除运算,当前对象数值除以参数 val。roundingMode 为要应用的舍入模式。

示例代码如下:
import java.math.BigDecimal;

public class Main {
    public static void main(String[] args) {
        // 创建 BigDecimal 对象
        BigDecimal num1 = new BigDecimal("12345678901234567890123456789.123456789");
        BigDecimal num2 = new BigDecimal("98765432109876543210987654321.987654321");

        // 执行基本的算术运算
        BigDecimal sum = num1.add(num2);
        BigDecimal difference = num1.subtract(num2);
        BigDecimal product = num1.multiply(num2);
        BigDecimal quotient = num1.divide(num2, 10, BigDecimal.ROUND_HALF_UP); // ①

        // 显示结果
        System.out.println("数 1:" + num1);
        System.out.println("数 2:" + num2);
        System.out.println("和:" + sum);
        System.out.println("差:" + difference);
        System.out.println("积:" + product);
        System.out.println("商:" + quotient);
    }
}
运行结果如下:

数 1:12345678901234567890123456789.123456789
数 2:98765432109876543210987654321.987654321
和:111111111011111111101111111111.111111110
差:-86419753208641975320864197532.864197532
积:1219326311370217952261850327360615759547340344433609205911.347203169112635269
商:0.1249999989

上述代码第 ① 处是进行除法运算,该方法需要指定舍入模式,如果不指定舍入模式,则会发生运行期异常 ArithmeticException,舍入模式 ROUND_HALF_UP 是四舍五入。

相关文章