从零开始学Java-常用API:BigInteger、BigDecimal

121 阅读6分钟

目录

  • 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);

我们来运行看一下:

image.png

怎么样,是不是打印出了100了呀。那我改成1.1看一下:

image.png 他是不是就说了格式异常,1.1小数用不了呀。

  • 细节:字符串里面必须是整数,否则会报错!

BigInteger(String val,int radix)

获取指定进制的大整数

// 3.获取指定进制的大整数
BigInteger bg3 = new BigInteger("100",2);
System.out.println(bg3);

我们来运行看一下:

image.png

他会在打印的时候将100转成10进制的给你打印出来。打印的结果就是4.

static BigInteger valueOF(long val)

静态方法获取BigInteger的对象,内部有优化

BigInteger bg4 = BigInteger.valueOf(100);
System.out.println(bg4);

我们来运行看一下:

image.png

是不是打印的100呀。那这个时候有人就会想,这不是和第二种方法一样的吗?其实呀,还真不一样。我们来说一下他的小细节:

  1. 能表示范围比较小,在long的取值范围之内,如果超出long的范围就不行了

我们来获取一下long的最大取值范围试一下:

System.out.println(Long.MAX_VALUE);
// 9223372036854775807

image.png

是不是还能正常打印呀,那我们把这个数字加1看一下。

image.png

是不是还没运行就报错了呀,它提示数字太长了,超出了范围之内了。

下面我们来对构造方法做个小结吧:

  • 如果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);

我们是不是可以看到他是一个数组呀?是什么意思呀我们来看打印一下他的长度看一下:

image.png

他打印了一个2,我的计算结果也不是2呀,其实他是不是获取商和余数的呀,其中0索引就是商,1索引就是余数。我们来打印看一下:

System.out.println(arr[0]);
System.out.println(arr[1]);

image.png

是不是打印出来的分别是他们的商和余数呀。下面我们来说说BigInteger存储上限吧:

BigInteger存储上限

  • 数组中最多能存储个数:21亿多
  • 数组中每一位能表示的数字:21亿多
  • BigInteger能表示的最大数字:42亿的21亿次方

下面我们来总结一下吧:

  • BigInteger表示一个大整数
  • 如何获取BigInteger的对象:
    1. BigInteger b1 = BigInteger.valueOf(1);
    2. 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);

image.png

可以看到小数的是不是不精确呀,而在一些金融行业是要精确到某一位的,那这肯定是不行了,而我们今天学的这个就是专门治理他的,我们接着来看:

// 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);

image.png

怎么样,是不是能精确的参与小数计算呢?下面我们再来看一下通过静态方法获取对象吧:

// 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的对象:
    1. BigDecimal b1 = BigDecimal.valueOf(0.1111111);
    2. BigDecimal b1 = new BigDecimal("0.0000000001");

好啦,到这里就学习完毕啦,我们只需要多用就能记住啦,不用太刻意去记哟。有什么不懂的可以评论区一起互相探讨,我们下期不见不散!

==最后非常感谢您的阅读,也希望能得到您的反馈  ==