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
2
3
BigDecimal bd = new BigDecimal("2.5");
//这里表示setScale 方法将 BigDecimal 的值舍入到 0 位小数,并使用 HALF_UP 舍入模式,即四舍五入
bd = bd.setScale(0, RoundingMode.HALF_UP);