目录
- BigInteger
- BigDecimal
BigInteger
在java中,整数有四种类型:byte,short,int ,long。
其中占用字节个数:byte1字节,short2字节,int4字节,long8字节
下面我们来看一下BigInteger构造方法吧:
构造方法
| 方法名 | 说明 |
|---|---|
| public BigInteger(int num,Random rnd) | 获取随机大整数,范围[0-2的num次方-1] |
| public BigInteger(String val) | 获取指定的大整数 |
| public BigInteger(String val,int radix) | 获取指定进制的大整数 |
特殊的静态方法:对象一旦创建,内部记录的值不能发生改变
| 方法名 | 说明 |
|---|---|
| public static BigInteger valueOF(long val) | 静态方法获取BigInteger的对象,内部有优化 |
下面我们来实操一下吧:
BigInteger(int num,Random rnd)
获取随机大整数,范围[0-2的num次方-1]
// 1.获取一个随机的大整数
Random r = new Random();
BigInteger bg1 = new BigInteger(4,r);
System.out.println(bg1);
这个其实是和获取随机数差不多的,我们接着看下一个:
BigInteger(String val)
获取指定的大整数
// 2.获取指定的大整数
BigInteger bg2 = new BigInteger("100");
System.out.println(bg2);
我们来运行看一下:
怎么样,是不是打印出了100了呀。那我改成1.1看一下:
他是不是就说了格式异常,1.1小数用不了呀。
- 细节:字符串里面必须是整数,否则会报错!
BigInteger(String val,int radix)
获取指定进制的大整数
// 3.获取指定进制的大整数
BigInteger bg3 = new BigInteger("100",2);
System.out.println(bg3);
我们来运行看一下:
他会在打印的时候将100转成10进制的给你打印出来。打印的结果就是4.
static BigInteger valueOF(long val)
静态方法获取BigInteger的对象,内部有优化
BigInteger bg4 = BigInteger.valueOf(100);
System.out.println(bg4);
我们来运行看一下:
是不是打印的100呀。那这个时候有人就会想,这不是和第二种方法一样的吗?其实呀,还真不一样。我们来说一下他的小细节:
- 能表示范围比较小,在long的取值范围之内,如果超出long的范围就不行了。
我们来获取一下long的最大取值范围试一下:
System.out.println(Long.MAX_VALUE);
// 9223372036854775807
是不是还能正常打印呀,那我们把这个数字加1看一下。
是不是还没运行就报错了呀,它提示数字太长了,超出了范围之内了。
下面我们来对构造方法做个小结吧:
- 如果BigInteger表示的数字没有超出long的范围,可以用静态方法获取。
- 如果BigInteger表示的超出long的范围,可以用构造方法获取。
- 对象一旦创建,BigInteger内部记录的值不能发生改变。
- 只要进行计算都会产生一个新的BigInteger对象。
成员方法
| 方法名 | 说明 |
|---|---|
| public BigInteger add(BigInteger val) | 加法 |
| public BigInteger subtract(BigInteger val) | 减法 |
| public BigInteger multiply(BigInteger val) | 乘法 |
| public BigInteger divide(BigInteger val) | 除法,获取商 |
| public BigInteger[] divideAndRemainder(BigInteger val) | 除法,获取商和余数 |
| public boolean equals(Object x) | 比较是否相同 |
| public BigInteger pow(int exponent) | 次幂 |
| public BigInteger max/min(BigInteger val) | 返回最大/最小值 |
| public int intValue(BigInteger val) | 转为int类型整数,超出范围数据有误 |
下面我们来实操一下吧:
//1.创建两个BigInteger对象
BigInteger bd1 = BigInteger.valueOf(10);
BigInteger bd2 = BigInteger.valueOf(4);
//2.加法
BigInteger bd3 = bd1.add(bd2);
System.out.println(bd3); // 14
// 减法
BigInteger bd4 = bd1.subtract(bd2);
System.out.println(bd4); // 6
// 乘法
BigInteger bd5 = bd1.multiply(bd2);
System.out.println(bd5); // 40
// 除法,获取商
BigInteger bd6 = bd1.divide(bd2);
System.out.println(bd6); // 2
// 比较是否相同
boolean result = bd1.equals(bd2);
System.out.println(result); // false
// 次幂
BigInteger bd8 = bd1.divide(bd2);
System.out.println(bd8); // 2
// 返回最大/最小值
BigInteger bd9 = bd1.max(bd2);
System.out.println(bd9); // 10
BigInteger bd10 = bd1.min(bd2);
System.out.println(bd10); // 4
我们下面来说一下比较特殊的:
- BigInteger[] divideAndRemainder(BigInteger val) | 除法,获取商和余数
BigInteger bd1 = BigInteger.valueOf(10);
BigInteger bd2 = BigInteger.valueOf(3);
// 除法,获取商和余数
BigInteger[] arr = bd1.divideAndRemainder(bd2);
System.out.println(arr.length);
我们是不是可以看到他是一个数组呀?是什么意思呀我们来看打印一下他的长度看一下:
他打印了一个2,我的计算结果也不是2呀,其实他是不是获取商和余数的呀,其中0索引就是商,1索引就是余数。我们来打印看一下:
System.out.println(arr[0]);
System.out.println(arr[1]);
是不是打印出来的分别是他们的商和余数呀。下面我们来说说BigInteger存储上限吧:
BigInteger存储上限
- 数组中最多能存储个数:21亿多
- 数组中每一位能表示的数字:21亿多
- BigInteger能表示的最大数字:42亿的21亿次方
下面我们来总结一下吧:
- BigInteger表示一个大整数
- 如何获取BigInteger的对象:
- BigInteger b1 = BigInteger.valueOf(1);
- BigInteger b1 = new BigInteger("1");
整数到这里就学完啦,下面我们来学习一下小数的吧:
BigDecimal
下面我们来初步认识一下BigDecimal的作用吧:
- 用来计算小数的精确计算
- 用来表示很大的小数。
下面我们来看段代码:
// 1.通过传递Double类型的小数来创建对象
BigDecimal bg1 = new BigDecimal(0.000001);
BigDecimal bg2 = new BigDecimal(0.100000);
System.out.println(bg1);
System.out.println(bg2);
可以看到小数的是不是不精确呀,而在一些金融行业是要精确到某一位的,那这肯定是不行了,而我们今天学的这个就是专门治理他的,我们接着来看:
// 2.通过传递字符串表示小数来创建对象
BigDecimal bg3 = new BigDecimal("0.000001");
BigDecimal bg4 = new BigDecimal("0.100000");
BigDecimal bg5 = bg3.add(bg4);
System.out.println(bg3);
System.out.println(bg4);
System.out.println(bg5);
怎么样,是不是能精确的参与小数计算呢?下面我们再来看一下通过静态方法获取对象吧:
// 3.通过静态方法获取对象
BigDecimal bg6 = BigDecimal.valueOf(10.0);
BigDecimal bg7 = BigDecimal.valueOf(10.0);
下面我们来看一下他的成员方法吧:
成员方法
| 方法名 | 说明 |
|---|---|
| static BigDecimal valueof(double val) | 获取对象 |
| BigDecimal add(BigDecimal val) | 加法 |
| BigDecimal subtract(BigDecimal val) | 减法 |
| BigDecimal multiply(BigDecimal val) | 乘法 |
| BigDecimal divide(BigDecimal val) | 除法 |
| BigDecimal divide(BigDecimal val,精确几位,舍入模式) | 除法 |
我们来实操一下吧:
// 创建两个BigDecimal对象
BigDecimal bg1 = BigDecimal.valueOf(10.0);
BigDecimal bg2 = BigDecimal.valueOf(4.0);
// 1.加法
BigDecimal bg3 = bg1.add(bg2);
System.out.println(bg3); //14.0
// 2.减法
BigDecimal bg4 = bg1.subtract(bg2);
System.out.println(bg4); // 6
// 3.乘法
BigDecimal bg5 = bg1.multiply(bg2);
System.out.println(bg5); // 40
// 4.除法
BigDecimal bg6 = bg1.divide(bg2);
System.out.println(bg6); // 2,5
// 5.除法,精确几位,舍入模式
BigDecimal bg7 = bg1.divide(bg2,2, RoundingMode.HALF_UP);
System.out.println(bg7); // 2,50
下面我们来总结一下吧:
- BigDecimal表示较大的小数和解决小数运算精度失真问题。
- 如何获取BigDecimal的对象:
- BigDecimal b1 = BigDecimal.valueOf(0.1111111);
- BigDecimal b1 = new BigDecimal("0.0000000001");
好啦,到这里就学习完毕啦,我们只需要多用就能记住啦,不用太刻意去记哟。有什么不懂的可以评论区一起互相探讨,我们下期不见不散!
==最后非常感谢您的阅读,也希望能得到您的反馈 ==