BigInteger和BigDecimal:
我们在学习JavaSE基础的时候学习过int和double,前者是整形,后者是双精度浮点数,但它们是有最大值的,也就是说,他两并不支持无限大的数字。
其范围如下所示:
因此对于特别大的数字,Java为我们提供了两个类可用来操作,分别是BigInteger[支持任意长度的整数]
和BigDecimal[支持任意长度的浮点数
],理论上可以存储无限长的数字(只要你计算机的内存足够
)
创建:
new BigXXX():
public static void main(String[] args) {
//注意传递的参数是字符串而不是整数或者浮点数
BigInteger bigInteger=new BigInteger("111111111111111111111111111111111");
System.out.println(bigInteger);
BigDecimal bigDecimal=new BigDecimal("1221345676867564534.123453678675645342");
System.out.println(bigDecimal);
}
输出:
111111111111111111111111111111111
1221345676867564534.123453678675645342
BigXXX.ValueOf():
public static void main(String[] args) {
BigDecimal bigDecimal=BigDecimal.valueOf(12213456768678974.12);
BigInteger bigInteger=BigInteger.valueOf(111111111111111L);
System.out.println(bigInteger);
System.out.println(bigDecimal);
}
输出:
111111111111111
12213456768678974
为什么这里打印出来的bigDecimal少了我们提供的一部分呢?
问题不在BigDecimal,而在ValueOf,我们提供的是double类型的,而double类型的长度一般在15-17位,因此17位以后得会被略掉,因此比较好的办法还是使用构造方法的形式创建
.
Scanner对象.BigXXX():
public static void main(String[] args) {
Scanner scanner=new Scanner(System.in);
System.out.println(scanner.nextBigInteger());
System.out.println(scanner.nextBigDecimal());
}
输出:
111111111111111
111111111111111
111111111111111.32145
111111111111111.32145
方法:
add()
:相加
substract()
:相减
multiply
:相乘
divide
:相除
remainder()
:取余数
max()
:取最大值
min()
:取最小值
注意:调用BigInteger的上述运算方法时,不能直接传入整形数字,原因如下所示:
查看上述方法的源码:
以相加为例:
BigInteger bigInteger1=new BigInteger("741258963");
BigInteger bigInteger3=bigInteger1.add(BigInteger.valueOf(2));
System.out.println(bigInteger3);
输出:
741258965
divideAndRemainder()
:得到商和余数
public static void main(String[] args) {
BigInteger bigInteger1=new BigInteger("741258963");
BigInteger bigInteger2=new BigInteger("457123698");
BigInteger[] bigInteger3=bigInteger1.divideAndRemainder(bigInteger2);
//得到余数
System.out.println(bigInteger3[0]);
//得到商
System.out.println(bigInteger3[1]);
}
注意该方法的返回值是一个BigInteger[],数组中第一个数字是商,第二个数字是余数
compareTo()
:比较大小
public static void main(String[] args) {
BigInteger bigInteger1=new BigInteger("741258963");
BigInteger bigInteger2=new BigInteger("2");
int result=bigInteger1.compareTo(bigInteger2);
System.out.println(result);
}
输出:
bigInteger1大于bigInteger2,成立返回1,否则返回-1,相等返回0
1
intValue():转换成int型和doubleValue():转换成double型
public static void main(String[] args) {
BigInteger bigInteger2=new BigInteger("2");
int num1= bigInteger2.intValue();
Double num2= bigInteger2.doubleValue();
System.out.println(num1);
System.out.println(num2);
}
输出:
2
2.0
上述方法对于BigDecimal对象同样适用,这里就不过多举例。
注意:BigDecimal对象的divide需要注意的地方如下所示
public static void main(String[] args) {
BigDecimal bigDecimal=new BigDecimal("3.14159");
//未做任何处理
BigDecimal bigDecimal1=bigDecimal.divide(BigDecimal.valueOf(2));
System.out.println(bigDecimal1);
//RoundingMode.HALF_UP->四舍五入
BigDecimal bigDecimal2=bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.HALF_UP);
System.out.println(bigDecimal2);
//RoundingMode.UP->向上取整
BigDecimal bigDecimal3=bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.UP);
System.out.println(bigDecimal3);
//RoundingMode.DOWN->向下取整
BigDecimal bigDecimal4=bigDecimal.divide(BigDecimal.valueOf(2),RoundingMode.DOWN);
System.out.println(bigDecimal4);
}
输出:
默认保留和提供的bigDecimal对象相同的位数
1.570795
1.57080
1.57080
1.57079
实现进制之间的转换:
public static void main(String[] args) {
//二进制转化为10进制
int num=Integer.parseInt("001",2);
System.out.println(num);
//十六进制转化为10进制
int num1=Integer.parseInt("D",16);
System.out.println(num1);
//八进制转化为10进制
int num2=Integer.parseInt("00012",8);
System.out.println(num2);
}
输出如下所示:
1
13
10
但是当数据过大的情况下就会抛出异常:
public static void main(String[] args) {
int num3=Integer.parseInt("7418529633217965412369874",16);
System.out.println(num3);
}
输出如下所示:
那么我们可以使用大数类解决这个问题:
public static void main(String[] args) {
BigInteger bigInteger=new BigInteger("ABCDEF123",16);
System.out.println(bigInteger);
}
输出如下所示:
46118400291