Java中的基础数据类型能存储的最大的二进制数是 2 ^ 63 - 1,只要运算过程中会超过这个数,就会造成数据溢出,就会造成错误。但在Java中有两个类BigInteger和BigDecimal分别表示大整数类和大浮点数类,至于两个类的对象能表示最大范围不清楚,理论上能够表示无线大的数,只要计算机内存足够大。
这两个类都在java.math.*包中,因此每次必须在开头处引用该包;
BigInteger实现了任意精度的整数运算;
BigDecimal实现了任意精度的浮点数运算。
分别调用BigInteger.valueOf("普通数值"),BigDecimal.valueOf("普通数值")即可。
int a=10;
BigInteger.valueOf(a2);
double a=1.123456;
BigDecimal.valueOf(a);
import java.math.BigDecimal;
import java.math.BigInteger;
public class 创建 {
public static void main(String[] args) {
//1.直接声明
BigInteger a;
BigDecimal b;
//2.使用构造函数初始化
BigInteger a1 = new BigInteger("1234567891021212155646");
BigDecimal b1 = new BigDecimal("123456.756231");
}
}
使用
BigInteger.valueOf(long val);
BigDecimal.valueOf(double val);
注意:
val 不能超过 long 类型的最大取值9223372036854775807, 超过int时要在数后面加L(int的取值范围为: -231——231-1,即-2147483648——2147483647 )。
import java.math.BigDecimal;
import java.math.BigInteger;
public class 赋值 {
public static void main(String[] args) {
//BigInteger.valueOf(long val);
//BigDecimal.valueOf(double val);
BigInteger a;
BigDecimal b;
//注意 val 不能超过 long 类型的最大取值9223372036854775807, 超过int时要在数后面加L如:
a = BigInteger.valueOf(123456789101112L); //大于int范围的要加L
b = BigDecimal.valueOf(123456.12341235); // 超出的小数位数会自动舍弃
}
}
或者使用
BigInteger a;
BigInteger b = new BigInteger("123456");
a = b;
import java.math.BigInteger;
public class 赋值二 {
public static void main(String[] args) {
BigInteger a;
BigInteger b = new BigInteger("123456");
a = b;
System.out.print(a);//123456
}
}
方法:add();
import java.math.BigInteger;
public class 加法 {
public static void main(String[] args) {
BigInteger a, b, c;
a = BigInteger.valueOf(123456789); // 赋值为 123456789
b = BigInteger.valueOf(987654321); // 赋值为 987654321
c = a.add(b);
System.out.print(c);
}
}
方法:subtract();
import java.math.BigInteger;
public class 减法 {
public static void main(String[] args) {
BigInteger a, b, c;
a = BigInteger.valueOf(123456789); // 赋值为 123456789
b = BigInteger.valueOf(987654321); // 赋值为 987654321
c = a.subtract(b);
System.out.print(c);
}
}
方法:multiply();
import java.math.BigInteger;
public class 乘法 {
public static void main(String[] args) {
BigInteger a, b, c;
a = BigInteger.valueOf(123456789); // 赋值为 123456789
b = BigInteger.valueOf(987654321); // 赋值为 987654321
c = a.multiply(b);
System.out.print(c);
}
}
方法:divide();
import java.math.BigInteger;
public class 除法 {
public static void main(String[] args) {
BigInteger a, b, c;
a = BigInteger.valueOf(987654321); // 赋值为 987654321
b = BigInteger.valueOf(123456789); // 赋值为 123456789
c = a.divide(b); // 整数相除仍为整数
System.out.print(c);
}
}
使用构造函数BigInteger(String, int index),可以把一个index进制的字符串,转化为10进制的BigInteger。
BigInteger a = new BigInteger("111110", 2);把111110从二进制变为10进制赋值给a
a.toString(radix);//把十进制数a转变为radix数进制。
System.out.println(a.toString(16));把a转化为16进制的字符串输出
综合案例:
给定n个十六进制正整数,输出它们对应的八进制数。
答案:
import java.math.BigInteger;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc=new Scanner(System.in);
int n=sc.nextInt();
for(int i=1;i<=n;i++){
String s = sc.next();
String s1 = new BigInteger(s,16).toString(8);
System.out.println(s1);
}
}
}
最大值:max();
最小值:min();
BigInteger a, b, c, d;
a = BigInteger.valueOf(987654321);
b = BigInteger.valueOf(12345678);
c = a.max(b); //a,b中的最大值
d = a.min(b); //a,b中的最小值
System.out.println(c);
System.out.println(d);
输出:
987654321
12345678
方法:mod();
BigInteger a, b, c;
a = BigInteger.valueOf(987654321); // 赋值为 987654321
b = BigInteger.valueOf(123456789); // 赋值为 123456789
c = a.mod(b);
System.out.print(c);
输出:
9