精确运算一 BigInteger详解

简介

       在 Java 中提供了用于大数字运算的类,即 java.math.BigInteger 类和 java.math.BigDecimal 类。这两个类用于高精度计算,其中 BigInteger 类是针对整型大数字的处理类,而 BigDecimal 类是针对大小数的处理类。

       如果要存储比 Integer 更大的数字,Integer 数据类型就无能为力了。因此,Java 中提供 BigInteger 类来处理更大的数字。BigInteger 类型的数字范围较 Integer 类型要大得多。BigInteger 支持任意精度的整数,在运算中 BigInteger 类型可以准确地表示任何大小的整数值。

       除了基本的加、减、乘、除操作之外,BigInteger 类还封装了很多操作,像求绝对值、相反数、最大公约数以及判断是否为质数等。

静态字段

1
2
3
static BigInteger ONE     BigInteger 的常量 1
static BigInteger TEN BigInteger 的常量 10
static BigInteger ZERO BigInteger 的常量 0

构造方法

       要使用 BigInteger 类,首先要创建一个 BigInteger 对象。BigInteger 类提供了很多种构造方法,其中最直接的一种是参数以字符串形式代表要处理的数字。这个方法语法格式如下:

1
BigInteger(String val)

       这里的 val 是数字十进制的字符串。例如,要将数字 5 转换为 BigInteger 对象,语句如下:

1
BigInteger bi = new BigInteger("5")

       其余构造方法如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
BigInteger(byte[] val) 
将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger。

BigInteger(int signum, byte[] magnitude)
将 BigInteger 的符号-数量表示形式转换为 BigInteger。

BigInteger(int bitLength, int certainty, Random rnd)
构造一个随机生成的正 BigInteger,它可能是一个具有指定 bitLength 的素数。

BigInteger(int numBits, Random rnd)
构造一个随机生成的 BigInteger,它是在 0 到 (2numBits - 1)(包括)范围内均匀分布的值。

BigInteger(String val)
将 BigInteger 的十进制字符串表示形式转换为 BigInteger。

BigInteger(String val, int radix)
将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。

方法

       常用方法名称以及说明:

方法名称 说明
add(BigInteger val) 做加法运算,返回其值为 (this + val) 的 BigInteger。
subtract(BigInteger val) 做减法运算,返回其值为 (this - val) 的 BigInteger。
multiply(BigInteger val) 做乘法运算,返回其值为 (this * val) 的 BigInteger。
divide(BigInteger val) 做除法运算, 返回其值为 (this / val) 的 BigInteger。
remainder(BigInteger val) 做取余数运算, 返回其值为 (this % val) 的 BigInteger。
divideAndRemainder(BigInteger val) 做除法运算,返回包含 (this / val) 和 (this % val) 的两个 BigInteger 的数组。数组的第一个值为商,第二个值为余数。
pow(int exponent) 做参数的 exponent 次方运算,返回其值为 (this exponent) 的 BigInteger。
negate() 取相反数,返回其值是 (-this) 的 BigInteger。
shiftLeft(int n) 将数字左移 n 位,返回其值为 (this << n) 的 BigInteger。如果 n 为负数,则做右移操作。
shiftRight(int n) 将数字右移 n 位, 返回其值为 (this >> n) 的 BigInteger。如果 n 为负数,则做左移操作。
and(BigInteger val) 做与运算,返回其值为 (this & val) 的 BigInteger。
or(BigInteger val) 做或运算,返回其值为 (this | val) 的 BigInteger。
compareTo(BigInteger val) 做数字的比较运算,将此 BigInteger 与指定的 BigInteger 进行比较。
equals(Object obj) 当参数 obj 是 Biglnteger 类型的数字并且数值相等时返回 true, 其他返回 false。
min(BigInteger val) 返回此 BigInteger 和 val 的最小值。
max(BigInteger val) 返回此 BigInteger 和 val 的最大值。

       其它方法:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
BigInteger abs() 
返回其值是此 BigInteger 的绝对值的 BigInteger。

BigInteger andNot(BigInteger val)
返回其值为 (this & ~val) 的 BigInteger。

int bitCount()
返回此 BigInteger 的二进制补码表示形式中与符号不同的位的数量。

int bitLength()
返回此 BigInteger 的最小的二进制补码表示形式的位数,不包括符号位。

BigInteger clearBit(int n)
返回其值与清除了指定位的此 BigInteger 等效的 BigInteger。

double doubleValue()
将此 BigInteger 转换为 double

BigInteger flipBit(int n)
返回其值与对此 BigInteger 进行指定位翻转后的值等效的 BigInteger。

float floatValue()
将此 BigInteger 转换为 float

BigInteger gcd(BigInteger val)
返回一个 BigInteger,其值是 abs(this)abs(val) 的最大公约数。

int getLowestSetBit()
返回此 BigInteger 最右端(最低位)1 比特的索引(即从此字节的右端开始到本字节中最右端 1 比特之间的 0 比特的位数)。

int hashCode()
返回此 BigInteger 的哈希码。

int intValue()
将此 BigInteger 转换为 int

boolean isProbablePrime(int certainty)
如果此 BigInteger 可能为素数,则返回 true,如果它一定为合数,则返回 false

long longValue()
将此 BigInteger 转换为 long

BigInteger mod(BigInteger m)
返回其值为 (this mod m) 的 BigInteger。

BigInteger modInverse(BigInteger m)
返回其值为 (this-1 mod m) 的 BigInteger。

BigInteger modPow(BigInteger exponent, BigInteger m)
返回其值为 (this exponent mod m) 的 BigInteger。

BigInteger nextProbablePrime()
返回大于此 BigInteger 的可能为素数的第一个整数。

BigInteger not()
返回其值为 (~this) 的 BigInteger。

BigInteger probablePrime(int bitLength, Random rnd)
返回有可能是素数的、具有指定长度的正 BigInteger。

BigInteger setBit(int n)
返回其值与设置了指定位的此 BigInteger 等效的 BigInteger。

int signum()
返回此 BigInteger 的正负号函数。

boolean testBit(int n)
当且仅当设置了指定的位时,返回 true

byte[] toByteArray()
返回一个 byte 数组,该数组包含此 BigInteger 的二进制补码表示形式。

String toString()
返回此 BigInteger 的十进制字符串表示形式。

String toString(int radix)
返回此 BigInteger 的给定基数的字符串表示形式。

BigInteger valueOf(long val)
返回其值等于指定 long 的值的 BigInteger。

BigInteger xor(BigInteger val)
返回其值为 (this ^ val) 的 BigInteger。

实例

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
import java.math.BigInteger;
import java.util.Scanner;
public class Test
{
    public static void main(String[] args)
    {
        Scanner input=new Scanner(System.in);
        System.out.println("请输入一个整型数字:");
        //保存用户输入的数字
        int num=input.nextInt();
 
        //使用输入的数字创建BigInteger对象
        Biglnteger bi=new BigInteger(num+"");
 
        //计算大数字加上99的结果
        System.out.println("加法操作结果:"+bi.add(new BigInteger("99")));
 
        //计算大数字减去25的结果
        System.out.println("减法操作结果:"+bi.subtract(new BigInteger("25")));
 
        //计算大数字乘以3的结果
        System.out.println("乘法橾作结果:"+bi.multiply(new BigInteger("3")));
 
        //计算大数字除以2的结果
        System.out.println("除法操作结果:"+bi.divide(new BigInteger("2")));
 
        //计算大数字除以3的商
        System.out.println("取商操作结果:"+bi.divideAndRemainder(new BigInteger("3"))[0]);
 
        //计算大数字除以3的余数
        System.out.println("取余操作结果:"+bi.divideAndRemainder(new BigInteger("3"))[1]);
 
        //计算大数字的2次方
        System.out.println("取 2 次方操作结果:"+bi.pow(2));
 
        //计算大数字的相反数
        System.out.println("取相反数操作结果:"+bi.negate());
    }
}

       上述代码将用户输入的整型数字保存到 num 变量中,由于 BigInteger 类的构造方法只接收字符串类型的参数,所以使用“new BigInteger(num+””)” 代码来创建 BigInteger 对象。接下来的代码演示了如何调用 BigInteger 类提供的运算方法,运行效果下所示。

1
2
3
4
5
6
7
8
9
10
请输入一个整型数字:
125
加法操作结果:224
减法操作结果:100
乘法橾作结果:375
除法操作结果:62
取商操作结果:41
取余操作结果:2
取 2 次方操作结果:15625
取相反数操作结果:-125

参考资料:
java入门教程 java BigInteger类和BigDecimal类
OpenFire_ 高精度操作数值 BigDecimal类和BinInteger类

Fork me on GitHub