目录
BigInteger(大的整数)
基本使用
构造方法
下面是对三个构造方法的演示:
import java.math.BigInteger;
import java.util.Random;
public class BigintegerDemo {
public static void main(String[] args) {
//获得一个个随机的大整数
BigInteger bigNum1 = new BigInteger(3,new Random());
//指定随机数的范围为为0~2的3次幂-1
System.out.println(bigNum1);
//获得10个随机的大整数
Random r = new Random();
for (int i = 0; i < 10; i++) {
BigInteger bigNum2 = new BigInteger(3,r);
//指定随机数的范围为为0~2的3次幂-1
System.out.println(bigNum2);
}
//获得一个指定的大整数
BigInteger bigNum3 = new BigInteger("123456789");
//字符串必须是整数,否则会报错
System.out.println(bigNum3);
//获得指定进制的大整数
BigInteger bigNum4 = new BigInteger("10110011",2);
//字符串中的数必须是满足进制需求的整数
System.out.println(bigNum4);
}
}
还有一个静态方法
下面是对这个静态方法的演示:
import java.math.BigInteger;
public class BigintegerDemo2 {
public static void main(String[] args) {
//静态方法获取Biginteger的对象,内部有优化
BigInteger bigNum5 = BigInteger.valueOf(100);
//1.能表示的范围比较小,范围为long的范围
System.out.println(bigNum5);
//2.对内部常用的数字-16~16进行了优化,提前创建好了Biginteger对象,如果多次获取,不会重新创建
BigInteger bigNum6 = BigInteger.valueOf(16);
BigInteger bigNum7 = BigInteger.valueOf(16);
System.out.println(bigNum6 == bigNum7);//比较6和7的地址值是否一致,true
BigInteger bigNum8 = BigInteger.valueOf(17);
BigInteger bigNum9 = BigInteger.valueOf(17);
System.out.println(bigNum8 == bigNum9);//比较8和9的地址值是否一致,false
}
}
构造方法小结
成员方法
下面是对部分成员方法的代码实现
import java.math.BigInteger;
public class BigintegerDemo3 {
public static void main(String[] args) {
//创建两个Biginteger对象
BigInteger a = new BigInteger("100");
BigInteger b = new BigInteger("200");
//加法
BigInteger sum = a.add(b);
System.out.println(sum); // 输出:300
//减法
BigInteger difference = a.subtract(b);
System.out.println(difference); // 输出:-100
//乘法
BigInteger product = a.multiply(b);
System.out.println(product); // 输出:20000
//除法
BigInteger quotient = b.divide(a);
System.out.println(quotient); // 输出:2
// 获取余数
BigInteger remainder = b.mod(a);
System.out.println(remainder); // 输出:0
//比较
int comparison = a.compareTo(b);
if (comparison < 0) {
System.out.println("a is less than b");
} else if (comparison > 0) {
System.out.println("a is greater than b");
} else {
System.out.println("a is equal to b");
}
//幂运算
BigInteger power = a.pow(3); // 计算a的3次方
System.out.println(power); // 输出:1000000
}
}
原理解析
底层存储方式
一个简单的例子
BigInteger的底层存储方式主要是利用一个int的数组(通常称为mag)来存储大整数。当需要存储的整数大于32位时,它会被分割成多个32位的部分,并存储在这个int数组中。这种存储方式使得BigInteger能够表示任意精度的整数,从而突破了Java中基本整数类型(如byte、short、int、long)的大小限制
BigInteger的存储上线
所以BigInteger的存储几乎无上限
BigDecimal(大的小数)
表示较大地小数解决小数运算精度失真的问题
基本使用
构造方法
构造方法获取BigDecimal对象
public BigDecimal(double val) (这种方法可能是不精确的,所以不建议去使用)
public BigDecimal(String val)
静态方法获取BigDecimal对象
public static BigDecimal valueOf(double val)
下面是对上述方法的演示
import java.math.BigDecimal;
public class BigDecimalDemo {
public static void main(String[] args) {
//创建double类型的bigdecimal对象
BigDecimal bd1 = new BigDecimal(0.01);
System.out.println(bd1);//结果不精确
//创建string类型的bigdecimal对象
BigDecimal bd2 = new BigDecimal("0.01");
System.out.println(bd2);//结果精确
BigDecimal bd3 = new BigDecimal("0.09");
BigDecimal bd4 = bd3.add(bd2);
System.out.println(bd4);
//通过静态方法获取对象
BigDecimal bd5 = BigDecimal.valueOf(10);
BigDecimal bd6 = BigDecimal.valueOf(10);
System.out.println(bd5 == bd6);//true
//如果表示的数字不大,没有超出double范围,建议使用静态方法
//如果表示的数字大,超出double范围,建议使用构造方法
//如果传递0~10的整数,那么方法会返回已经创建好的对象,不用new新的对象
}
}
成员方法
下面是对成员方法的代码示例:
import java.math.BigDecimal;
public class BigDecimalDemo2 {
public static void main(String[] args) {
BigDecimal bd1 = new BigDecimal("123.456");
BigDecimal bd2 = new BigDecimal("789.123");
//创建两个bigdecimal对象
System.out.println("bd1: " + bd1);
System.out.println("bd2: " + bd2);
//加法
bd1 = bd1.add(bd2);
System.out.println("bd1 + bd2: " + bd1);
//减法
bd1 = bd1.subtract(bd2);
System.out.println("bd1 - bd2: " + bd1);
//乘法
bd1 = bd1.multiply(bd2);
System.out.println("bd1 * bd2: " + bd1);
//除法
bd1 = bd1.divide(bd2, 2, BigDecimal.ROUND_HALF_UP);
System.out.println("bd1 / bd2: " + bd1);
//在除法中,需要指定小数点后的位数和舍入模式。这里使用了两位小数和四舍五入模式。
//比较
int cmp = bd1.compareTo(bd2);
if (cmp > 0) {
System.out.println("bd1 is greater than bd2");
} else if (cmp < 0) {
System.out.println("bd1 is less than bd2");
} else {
System.out.println("bd1 is equal to bd2");
}
//设置精度
bd1 = bd1.setScale(2, BigDecimal.ROUND_HALF_UP);
System.out.println("bd1 with scale set to 2: " + bd1);
}
}
tip:在除法中除了我们上述四舍五入以外的舍去方式
原理解析
底层存储模式
如果想要清晰地看出底层逻辑,就需要设debug测试