BigInteger

  • 当有long类型也装不下的数,就可以用大整数BigInteger来装
  • 对象一旦创建,里面的值不能改变

构造方法

方法一: 获取一个随机的大整数

获取随机最大整数,范围:[0~2的num次方-1]

1
BigInteger bd1 = new BigInteger(int num,Random rnd);

代码实现:
1
2
3
4
5
Random r = new Random();
BigInteger bd1 = new BigInteger(4,r);
//或者写:
BigInteger bd2 = new BigInteger(4,new Random());
System.out.println(bd1);//0~15

方法二:获取指定的大整数

只能写整数!!!

1
BigInteger bd2 = new BigInteger("999999999999999999999999999999");

方法三:获取指定进制的大整数

只能写整数!!!

字符串中的数字必须要和进制吻合

1
BigInteger bd4 = new BigInteger("100",2);

方法四:获取BigInteger对象

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

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

在内部对常用的数字:-16~16进行了优化

提前把-16~16先创建好了对象,如果多次获取不会重新创建新的

1
BigInteger bd5 = BigInteger.valueOf(16);

对象一旦创建,内部数据就不能发生改变

1
2
3
4
BigInteger bd6 = BigInteger.valueOf(1);
BigInteger bd7 = BigInteger.valueOf(2);
BigInteger result = bd6.add(bd7);
System.out.println(result);输出3

此时,不会修改参与计算的BigInteger对象中的值,而是产生了一个新的BigInteger对象记录3

1
2
System.out.println(bd6 == result);//false
System.out.println(bd7 == result);//false

其他常用成员方法

方法一:加法

1
public BigInteger add(BigInteger val)

方法二:减法

1
public BigInteger subtract(BigInteger val)

方法三:乘法

1
public BigInteger multiply(BigInteger val)

方法四:除法,获取商

1
public BigInteger divide(BigInteger val)

方法五:除法,获取商和余数

结果存进一个长度为2的数组里面,0索引为商,1索引为余数

1
public BigInteger[] divideAndRemainder(BigInteger val)

方法六:比较是否相同

1
public boolean equals(Object x)

方法七:次幂

1
public BigInteger pow(int exponent)

方法八:返回较大值/较小值

1
public BigInteger max/min(BigInteger val)

方法九:转为int类型整数

超出范围数据有误

1
public int intValue(BigInteger val)

BigDecimal

作用:表示较大的小数和解决小数运算精度失真问题
BigDecimal都是不可变的(immutable)的,在进行每一步运算时,都会产生一个新的对象

构造方法

方法一: 获取BigDecimal对象(double)

但是这个方法获取的BigDecima仍然可能丢失精度,我们一般不用

查阅了api帮助文档:

        1. 这个构造函数的结果可能有点不可预测。 有人可能会认为在Java中编写new BigDecimal(0.1)会创建一个BigDecimal ,它正好等于0.1(未缩放值为1,标度为1),但它实际上等于0.1000000000000000055511151231257827021181583404541015625。 这是因为0.1不能精确地表示为double (或者,就此而言,作为任何有限长度的二进制分数)。 因此,正在传递给构造的值不是正好等于0.1,虽然表面上。
          1
          public BigDecimal(double val)

方法二:获取BigDecimal对象(String)

这个不会丢失精度

1
public BigDecimal(String val)

方法三:静态方法获取BigDecimal对象

和BigInteger的静态构造方法一样有范围但有优化

查阅源码:如果我们传递的是[0,10]的整数,那么方法会返回已经创建好的对象,不会重新new。

1
public static BigDecimal valueOf(double val)

BigDecimal的底层存储

BigDecimal里面的数据会转换成ASCII对应的值(包括负号和小数点)然后以数组的形式存储。

其他常用成员方法

方法一:加法

1
public BigDecimal add(BigDecimal val)

方法二:减法

1
public BigDecimal subtract

方法三:乘法

1
public BigDecimal multiply(BigDecimal val)

方法四:除法

1
public BigDecimal divide(BigDecimal val)

方法五:除法(舍)

1
public BigDecimal divide(BigDecimal val,精确几位,舍入模式)

舍入模式(常用)

1
2
3
4
5
6
CEILING         //向正方向舍入
FLOOR //向负方向舍入
UP //向远离零的方向舍入
DOWN //向靠近零的方向舍入
HAALF_UP //四舍五入(.5为入)
HALF_DOWN //四舍五入(.5为舍)

课程链接:黑马程序员