星星之火-JAVA大数处理

本文最后更新于:December 3, 2021 pm

积土成山,风雨兴焉;积水成渊,蛟龙生焉;积善成德,而神明自得,圣心备焉。故不积跬步,无以至千里,不积小流无以成江海。齐骥一跃,不能十步,驽马十驾,功不在舍。面对悬崖峭壁,一百年也看不出一条裂缝来,但用斧凿,能进一寸进一寸,能进一尺进一尺,不断积累,飞跃必来,突破随之。


目录

导包:import java,math.*;
或者:import java,math.BigInteger; import java,math.BigDecimal;

1.整数(BigInteger类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Scanner cin = new Scanner(System.in);
BigInteger a,b;
a = cin.nextBigInteger();
b = cin.nextBigInteger();
System.out.println(a.add(b)); //加
System.out.println(a.subtract(b)); //减
System.out.println(a.multiply(b)); //乘
System.out.println(a.divide(b)); //除

System.out.println(a.mod(b)); //求余,不能用于小数
System.out.println(a.remainder(b)); //求余

// a=7 b=3
10
4
21
2
1
1

2.小数(BigDecimal类)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Scanner cin = new Scanner(System.in);
BigDecimal a,b;
a = cin.nextBigDecimal();
b = cin.nextBigDecimal();
System.out.println(a.add(b)); //加
System.out.println(a.subtract(b)); //减
System.out.println(a.multiply(b)); //乘
System.out.println(a.divide(b)); //除
System.out.println(a.remainder(b)); //求余
// a=7.3 b=3.2
10.5
4.1
23.36
2.28125
0.9

2.1 小数位数

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
Scanner cin = new Scanner(System.in);
BigDecimal big ;
big = cin.nextBigDecimal();
System.out.println(big.scale()); //scale() 获取小数位数;若是整数则为负数,表示的末尾的0个数
System.out.println(big);
big = big.stripTrailingZeros(); // 去掉小数末尾的无用0
System.out.println(big.scale());
System.out.println(big);



//控制台
123.4500000

7
123.4500000
2
123.45

//控制台
12340000
0
12340000
-4
1.234E+7
  1. 对一个BigDecimal设置它的scale,如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断。
1
2
3
4
5
6
7
8
import java.math.BigDecimal;
import java.math.RoundingMode;

BigDecimal d1 = new BigDecimal("123.456789");
BigDecimal d2 = d1.setScale(4, RoundingMode.HALF_UP); // 四舍五入
BigDecimal d3 = d1.setScale(4, RoundingMode.DOWN); // 直接截断
System.out.println(d2); //123.4568
System.out.println(d3); //123.4567

对BigDecimal做加、减、乘时,精度不会丢失,但是做除法时,存在无法除尽的情况,这时,就必须指定精度以及如何进行截断。

1
2
3
4
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("23.456789");
BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP); //保留10位小数并四舍五入
BigDecimal d4 = d1.divide(d2); // 报错:ArithmeticException,因为除不尽

对BigDecimal做除法的同时求余数。调用divideAndRemainder()方法时,返回的数组包含两个BigDecimal,分别是商和余数,其中商总是整数,余数不会大于除数。

1
2
3
4
5
BigDecimal n = new BigDecimal("12.345");
BigDecimal m = new BigDecimal("0.12");
BigDecimal[] dr = n.divideAndRemainder(m);
System.out.println(dr[0]); // 102
System.out.println(dr[1]); // 0.105

2.2 比较BigDecimal

在比较两个BigDecimal的值是否相等时,要特别注意,使用equals()方法不但要求两个BigDecimal的值相等,还要求它们的scale()相等。
必须使用compareTo()方法来比较,它根据两个值的大小分别返回负数、正数和0,分别表示小于、大于和等于。总是使用compareTo()比较两个BigDecimal的值,不使用equals()。

1
2
3
4
5
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("123.45600");
System.out.println(d1.equals(d2)); // false,因为scale不同
System.out.println(d1.equals(d2.stripTrailingZeros()));// true,因为d2去除尾部0后scale变为2
System.out.println(d1.compareTo(d2)); // 0