昨天下午的训练中有一道签到题但是需要用到高精度,队里的三个人都不会高精度,没有办法我只好现场学习Java的大整数用法。训练之后打算对Java的大整数应用进行一个总结,以提升自己的Java应用水平。

1 介绍

Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类这两个类都在Java.math.*中,每次使用都需要在开头处调用这个包。

2 用法

构造

BigInteger

1
BigInteger(byte[] val)

将包含 BigInteger 的二进制补码表示形式的 byte 数组转换为 BigInteger,用字节数组中值的ASCII码构造BigInteger。

1
BigInteger(int signum, byte[] magnitude)

将 BigInteger 的符号-数量表示形式转换为 BigInteger,signum取值可以为1,0,-1。

1
BigInteger(String val)

将十进制的字符串转化为BigInteger

1
BigInteger(String val, int radix)

将指定基数的 BigInteger 的字符串表示形式转换为 BigInteger。

1
BigInteger(int bitLength, int certainty, Random rnd)

可以构造一个指定长度的且有一定的概率为素数的BigInteger。
bitLength为返回的BigInteger的二进制长度。
certainty为调用方允许的不确定性的度量。新的 BigInteger 表示素数的概率超出 (1 - 1/2certainty)。此构造方法的执行时间与此参数的值是成比例的。
rnd为当前随机的比特源。

1
BigInteger(int numBits, Random rnd)

用于生成一个范围在$[0,2^{numBits}-1)$的随机BigInteger。

BigDecimal

1
BigDecimal(int val)

用一个int类型的变量构造一个BigInteger。

1
BigDecimal(long val)

用一个long类型的变量构造一个BigInteger。

1
BigDecimal(double val)

用一个double类型的变量构造一个BigInteger。这个构造函数的结果可能有些不可预测,比如我们用new BigDicimal(0.1)构造一个BigDicimal,其值实际为0.1000000000000000055511151231257827021181583404541015625。

1
BigDecimal(String val)

用字符串类型的十进制浮点数构造BigDecimal。

1
BigDecimal(BigInteger val)

用BigInteger构造BigDemical。

1
BigDecimal(BigInteger unscaledVal, int scale)

构造的值为$unscaledVal*10^{-scale}$

常见函数

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
BigInteger add(BigInteger val); // 返回当前BigInteger与val的和
BigInteger subtract(BigInteger val) // 返回当前BigInteger与val的差值
BigInteger multiply(BigInteger val) // 返回当前BigInteger与val的乘积
BigInteger divide(BigInteger val) // 返回当前BigInteger与val的商
BigInteger pow(int exponent) // 返回当前BigInteger的exponent次方
BigInteger valueOf(parament val) // 将指定数据类型的变量转化为BigInteger
BigInteger abs() // 返回绝对值
BigInteger negate() // 返回相反数
BigInteger not() // 返回当前BigInteger的非
BigInteger and(BigInteger val) // 返回当前BigInteger与val取与之后的值
BigInteger andNot(BigInteger val) // 返回当前BigInteger与val取与非之后的值
BigInteger or(BigInteger val) // 返回当前BigInteger与val的按位或
BigInteger xor(BigInteger val) // 返回当前BigInteger与val的按位异或
double doubleValue() // 返回当前BigInteger的double类型的值
float floatValue() // 返回当前BigInteger的float类型的值
int intValue() // 返回当前BigInteger的整型值
long longValue() // 返回当前BigInteger的long型值
BigInteger gcd(BigInteger val) //返回当前BigInteger与val的最大公因数
BigInteger max(BigInteger val) // 返回当前BigInteger与val的最大者
BigInteger min(BigInteger val) // 返回当前BigInteger与val的最小者
BigInteger mod(BigInteger val) // 用当前BigInteger对val求模
BigInteger max(BigInteger val) // 返回当前BigInteger与val的最大者
BigInteger min(BigInteger val) // 返回当前BigInteger与val的最小者
BigInteger mod(BigInteger val) // 用当前BigInteger对val求模
BigInteger remainder(BigInteger val) // 返回当前BigInteger除以val的余数
BigInteger leftShift(int n) // 将当前BigInteger左移n位后返回
BigInteger rightShift(int n) // 将当前BigInteger右移n位后返回
byte[] toByteArray(BigInteger val) // 将当前BigInteger转换成二进制反码保存在byte数组中
String toString() // 将当前BigInteger转换成十进制的字符串形式

BigDecimal

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
BigDecimal valueOf(parament val) // 将特定的参数类型转换为BigDemical
BigDecimal valueOf(parament unscaledVal, int scale) // 构造的值为unscaledVal*10^{-scale}
BigDecimal add(BigDecimal augend) // 返回当前BigDecimal与augent的和
BigDecimal subtract(BigDecimal subtrahend) // 返回当前BigDecimal与subtrahend的差值
BigDecimal multiply(BigDecimal multiplicand) // 返回当前BigDecimal与multiplicand的乘积
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
/*
返回当前BigDecimal与divisor的商
divisor为除数
scale表示小数点后保留位数
roundingMode表示取舍方式,具体如下:
ROUND_CEILING 向正无穷方向舍入
ROUND_DOWN 向零方向舍入
ROUND_FLOOR 向负无穷方向舍入
ROUND_HALF_DOWN 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5
ROUND_HALF_EVEN 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN
ROUND_HALF_UP 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6
ROUND_UNNECESSARY 计算结果是精确的,不需要舍入模式
ROUND_UP 向远离0的方向舍入
*/
String toString() // 返回当前BigDemical的十进制字符串类型
double doubleValue() // 返回当前BigDemical的double类型
double longValue() // 返回当前BigDemical的long类型
double intValue() // 返回当前BigDemical的int类型
int compareTo(BigDecimal val) // 将当前的BigDecimal与val比较,返回值为1表示当前BigDecimal较大,为0表示二者相等,为-1表示val较大