BigInteger和BigDecimal
BigInteger
- 当有long类型也装不下的数,就可以用大整数BigInteger来装
- 对象一旦创建,里面的值不能改变
构造方法
方法一: 获取一个随机的大整数
获取随机最大整数,范围:[0~2的num次方-1]1
BigInteger bd1 = new BigInteger(int num,Random rnd);
代码实现:1
2
3
4
5Random 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 | BigInteger bd6 = BigInteger.valueOf(1); |
此时,不会修改参与计算的BigInteger对象中的值,而是产生了一个新的BigInteger对象记录31
2System.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帮助文档:
- 这个构造函数的结果可能有点不可预测。 有人可能会认为在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
6CEILING //向正方向舍入
FLOOR //向负方向舍入
UP //向远离零的方向舍入
DOWN //向靠近零的方向舍入
HAALF_UP //四舍五入(.5为入)
HALF_DOWN //四舍五入(.5为舍)
课程链接:黑马程序员















