相关文章:
- 《常用类 (一) ----- Arrays数组工具类》
- 《常用类 (二) ----- Math类》
- 《常用类 (三) ----- BigDecimal和BigInteger大数类》
- 《常用类 (四) ----- Random随机数类》
- 《常用类 (五) ----- Date日期类和Calender日历类》
- 《常用类 (六) ----- String类与字符串》
- 《常用类 (七) ----- 包装类》
一、摘要
java中的基本数据类型能存储的最大的二进制数是 2 ^ 63 - 1,对应的十进制数是9223372036854775807,也就是说只要运算过程中会超过这个数,就会造成数据溢出,从而造成错误.而java.math.*包中提供了大数类,其理论上可以存储无限位的大数,只要内存足够的话。
- 大数类又分为整数和浮点数.即BigInteger和BigDecimal
- 大数类的对象不能直接进行运算,需要调用类中相应的方法,并且方法的参数必须和调用的类相同,BigInteger不能调用BigDecimal, 不能作为其方法参数, 即整数和浮点数不能混合运算.
二、常用的构造方法
BigInteger:
构造方法 | 说明 |
---|---|
BigInteger(byte[] b) | 用字节数组实例化 |
BigInteger(String s) | 用字符串实例化 |
BigDecimal:
构造方法 | 说明 |
---|---|
BigDecimal(char[] c) | 用字符数组实例化 |
BigDecimal(String s) | 用字符串实例化 |
三、常用方法
返回值 | 方法名及形参 | 功能 |
---|---|---|
大数类型 | static valueOf( long/double ) | 用long/double类型赋值给大数类型 |
大数类型 | add( 大数类型 ) | 加 |
大数类型 | subtract( 大数类型 ) | 减 |
大数类型 | multiply( 大数类型 ) | 乘 |
大数类型 | divide( 大数类型 ) | 除 |
大数类型 | pow( int n ) | 幂运算 |
大数类型 | mod(大数类型) | 取余 |
大数类型 | gcd(大数类型) | 求最大公约数 |
大数类型 | max/min(大数类型) | 求最值 |
-1,0,1 | compareTo( 大数类型 ) | 比较大小 |
四、测试
public static void main(String[] args) {
BigInteger a, b;
BigDecimal c, d;
BigInteger m;
BigDecimal n;
// 用valueOf给大数类型赋值
a = BigInteger.valueOf(12345678910L);
b = BigInteger.valueOf(10987654321L);
c = BigDecimal.valueOf(12345.678910);
d = BigDecimal.valueOf(109876.54321);
// 加 add
initValue(a, b, c, d);
m = a.add(b);
n = c.add(d);
System.out.println("加法结果:\n" + m + "\n" + n);
// 减 subtract
initValue(a, b, c, d);
m = a.subtract(b);
n = c.subtract(d);
System.out.println("减法结果:\n" + m + "\n" + n);
// 乘 multiply
initValue(a, b, c, d);
m = a.multiply(b);
n = c.multiply(d);
System.out.println("乘法结果:\n" + m + "\n" + n);
// 除 divide
initValue(a, b, c, d);
m = a.divide(b);
n = c.divide(d, 100, RoundingMode.HALF_UP);
System.out.println("除法结果:\n" + m + "\n" + n);
// 幂运算
initValue(a, b, c, d);
m = a.pow(100);
n = c.pow(100);
System.out.println("幂运算结果:\n" + m + "\n" + n);
// 取余 mod
initValue(a, b, c, d);
m = a.mod(b);
System.out.println("取余结果:\n" + m);
// 最大公因数 gcd
initValue(a, b, c, d);
m = a.gcd(b);
System.out.println("最大公约数结果:\n" + m);
// 最值 max
initValue(a, b, c, d);
m = a.max(b);
n = c.max(d);
System.out.println("求最值结果:\n" + m + "\n" + n);
// 比较大小 compareTo
initValue(a, b, c, d);
int result1 = a.compareTo(b);
int result2 = c.compareTo(d);
}
private static void initValue(BigInteger a, BigInteger b, BigDecimal c, BigDecimal d) {
a = BigInteger.valueOf(12345678910L);
b = BigInteger.valueOf(10987654321L);
c = BigDecimal.valueOf(12345.678910);
d = BigDecimal.valueOf(109876.54321);
}
输出结果:
加法结果:
23333333231
122222.22212
减法结果:
1358024589
-97530.86430
乘法结果:
135650052221140070110
1356500522.2114007011
除法结果:
1
0.1123595496302108319667076282786890925524958549521882069045481031383094965133277421387490699526530909
幂运算结果:
14174173749143624867199388782976370696584598905623269233794905465646075736639363447485386999471083827856071215306792314850239157595445375554053121819626520989217777709746256424480921947327175482198714220258970951704496456554752431243887669182189882055034074852101536447387155979978224694792011542700957944706132863593588259846889044825464499985801594647890491425519189698057060140974706761606685501525428429105848344710793461513638685209871285158787924000699794775244283827677590792189058992967208305067790184530740009535853295239129970970153362090124167790426513536088580553023216199576498421192897633134220267560149599135706944364789976712679709057162136698835039484941101400189574308641460966764091221067090045342422202344822976773003356908149079355915959748838189606705194837617902681589663790654669167338960468794852887873720676274071749353578286175245427317435492142594903076621828436193110243792222340010000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000
14174173749143624867199388782976370696584598905623269233794905465646075736639363447485386999471083827856071215306792314850239157595445375554053121819626520989217777709746256424480921947327175482198714220258970951704496456554752431243887669182189882055034074852101536447387155979978224694792011542700957944706132863593588259846889044825464499985801594647890491425519189698057060140974706761606685501525428429105.84834471079346151363868520987128515878792400069979477524428382767759079218905899296720830506779018453074000953585329523912997097015336209012416779042651353608858055302321619957649842119289763313422026756014959913570694436478997671267970905716213669883503948494110140018957430864146096676409122106709004534242220234482297677300335690814907935591595974883818960670519483761790268158966379065466916733896046879485288787372067627407174935357828617524542731743549214259490307662182843619311024379222234001
取余结果:
1358024589
最大公约数结果:
1
求最值结果:
12345678910
109876.54321
Process finished with exit code 0
五、关于BigDecimal小数精度
-
BigDeciaml在进行加减乘除等运算时可以设置运算结果的小数位数和小数舍入模式,下面以除法为栗子。
BigDeciaml divide(BigDecimal divisor, int scale, RoundingMode roundingMode)
(1) scale参数:设置小数位数
(2) roundingMode参数:设置小数舍入模式 -
java.math.RoundingMode类中的舍入字段
字段 说明 举例 CEILING 向正无穷方向舍入 1.55 ≈ 1.6 1.55\approx1.6 1.55≈1.6, − 1.55 ≈ 1.5 -1.55 \approx1.5 −1.55≈1.5 FLOOR 向负无穷方向舍入 1.55 ≈ 1.5 1.55 \approx 1.5 1.55≈1.5, − 1.55 ≈ − 1.6 -1.55 \approx-1.6 −1.55≈−1.6 DOWN 向接近0方向舍入 1.55 ≈ 1.5 1.55 \approx 1.5 1.55≈1.5, − 1.55 ≈ − 1.5 -1.55 \approx -1.5 −1.55≈−1.5 UP 向远离0方向舍入 1.55 ≈ 1.6 1.55 \approx1.6 1.55≈1.6, − 1.55 ≈ − 1.6 -1.55 \approx-1.6 −1.55≈−1.6 HALF_UP 四舍五入 \ HALF_DOWN 五舍六入 \ HALF_EVEN 如果舍入前一位的数字为偶数,则采用五舍六入奇数则采用四舍五入 1.45 ≈ 1.4 1.45\approx1.4 1.45≈1.4, 1.55 ≈ 1.6 1.55\approx1.6 1.55≈1.6 UNNECESSARY 运算结果有精确位数,不需要舍入 \ -
测试