高精度计算
BIgInteger
BigInteger构造方法
当BigInteger对象被创建,里面的数据不能发生改变,进行运算的时候会创建新的BigInteger对象记录
- 获取随机大整数,范围:[0 - 2^num-1^];
public BigInteger(int num, Random rnd)
- 获取指定的大整数
public BigInteger(String val)
- 获取指定进制的大整数
例:当val = 100 ,radix = 10时,BigInteger表示的值是100
当val = 100, radix = 2时,BigInteger表示的值是4
注:字符串中的数字必须要和进制吻合,否则会报错
public BigInteger(String val, int radix)
- 静态方法获取Big Integer的对象,内部有优化
注:能表示的范围比较小,只能在long的取值范围之内,如果超出long的范围就不行了
在内部对-16到16进行了优化,提前把-16到16先创建好BigInteger的对象,如果多次获取并不会重新创建新的
public static BigInteger valueOf(long val)
BigInteger常用方法
- 加法
BigInteger bi2 = bi1.add(BigInteger val)
- 减法
BigInteger bi2 = bi1.subtract(BigInteger val)
- 乘法
BigInteger bi2 = bi1.multiply(BigInteger val)
- 除法,获取商
BigInteger bi2 = bi1.divide(BigInteger val)
- 取余
BigInteger bi2 = bi1.mod(BigInteger val)
- 除法,获取商和余数
BigInteger[] bi = bi1.divideAndRemainder(BigInteger val)
- 比较大小
int res = bi1.compareTo(bi2)
res == 0 -> bi1 == bi2
res > 0 -> bi1 > bi2
res < 0 -> bi1 < bi2
- 比较是否相同
boolean res = bi1.equals(bi2)
- 次幂
BigInteger bi2 = bi1.pow(int exponent)
- 返回较大值/较小值
BigInteger bi2 = bi1.max(BigInteger val)
- 转为int类型整数(long,float,double),超出范围数据有误
int res = bi1.intValue()
BIgDecimal
BigDecimal构造方法
性质与BigInteger类似
- 构造方法获取BigDecimal对象
通过传递double类型的小数来创建对象的方式有可能是不精确的,不推荐使用
public BigDecimal(double val)
public BigDecimal(String val)
- 静态方法获取BigDecimal对象
public static BigDecimal valueOf(double val)
BigDecimal常用方法
基本和BigInteger类似,不再赘述
这里主要看除法
public BigDecimal divide(BigDecimal val, int scale, RoundingMode roundingMode)
RoundingMode 枚举值与对应的整数常量
- RoundingMode.UP -> 0
远离零方向舍入。如果舍弃部分大于 0,则对结果进行上舍入。
5.5 -> 6, -5.5 -> -5
- RoundingMode.DOWN -> 1
向零方向舍入。如果舍弃部分大于 0,则不对结果进行舍入。
5.5 -> 5, -5.5 -> -5
- RoundingMode.CEILING -> 2
向正无穷方向舍入。如果结果为正,则相当于 ROUND_UP
;如果结果为负,则相当于 ROUND_DOWN
。
5.5 -> 6, -5.5 -> -5
- RoundingMode.FLOOR -> 3
向负无穷方向舍入。如果结果为正,则相当于 ROUND_DOWN
;如果结果为负,则相当于 ROUND_UP
。
5.5 -> 5, -5.5 -> -6
- RoundingMode.HALF_UP -> 4
“四舍五入”。如果舍弃部分大于等于 0.5,则向上舍入;否则向下舍入。
5.5 -> 6, 2.5 -> 3, -5.5 -> -6, -2.5 -> -2
- RoundingMode.HALF_DOWN -> 5
如果舍弃部分小于 0.5,则向下舍入;如果舍弃部分大于等于 0.5,则向上舍入。
5.5 -> 5, 2.5 -> 2, -5.5 -> -5, -2.5 -> -3
- RoundingMode.HALF_EVEN -> 6 银行家舍入
如果舍弃部分小于 0.5,则向下舍入;如果舍弃部分大于 0.5,则向上舍入;如果舍弃部分正好等于 0.5,则查看保留位前一位的奇偶性,如果是偶数,则向下舍入,如果是奇数,则向上舍入。这种舍入模式减少了累积误差。
5.5 -> 6 (因为 6 是偶数), 2.5 -> 2 (因为 2 是偶数), 1.5 -> 2 (因为 2 是偶数), -5.5 -> -6 (因为 6 是偶数), -2.5 -> -2 (因为 2 是偶数), -1.5 -> -2 (因为 2 是偶数)
- RoundingMode.UNNECESSARY -> 7 不进行舍入
1 | BigDecimal bd = new BigDecimal("2.5"); |