BigInteger和BigDecimal是以方法调用方式取代运算符方式来实现,等于是用速度换取了精度。
BigInteger(长整数)
常量名称 | 常量含义 |
---|---|
BigInteger.ONE | 常量1(BigInteger类型常数) |
BigInteger.TEN | 常量10(BigInteger类型常数) |
BigInteger.ZERO | 常量0(BigInteger类型常数) |
声明赋值
String bigNum1 = "-5";
// 将字符串类型转为BigInteger类型
BigInteger big1 = new BigInteger(bigNum1);
int bigNum2 = 3;
// 将int类型转为BigInteger类型
BigInteger big2 = BigInteger.valueOf(bigNum2);
常用方法
// BigInteger的加法
BigInteger bigAdd = big1.add(big2);
// BigInteger的减法
BigInteger bigSub = big1.subtract(big2);
// BigInteger的乘法
BigInteger bigMul = big1.multiply(big2);
// BigInteger的除法,得出的结果为整数,建议除法使用BIgDecimal
BigInteger bigDiv = big1.divide(big2);
// 指数运算
BigInteger bigPow = big1.pow(4);
// 取余运算
BigInteger bigRem = big1.remainder(big2);
// 取绝对值
BigInteger bigAbs = big1.abs();
// 取相反数
BigInteger bigNeg = big1.negate();
// 比较大小,若bigCom为1,则big1大于big2,为0则相等,为-1,则小于big2
int bigCom = big1.compareTo(big2);
//将BigInteger转为double
double num1 = big1.doubleValue();
//将BigInteger转为float
float num1Float = big1.floatValue();
BigDecimal(长小数)
常量名称 | 常量含义 |
---|---|
BigDecimal.ONE | 常量1(BigDecimal类型常数) |
BigDecimal.TEN | 常量10(BigDecimal类型常数) |
BigDecimal.ZERO | 常量0(BigDecimal类型常数) |
ROUND_CEILING | 向正无穷方向舍入 |
ROUND_DOWN | 向零方向舍入 |
ROUND_FLOOR | 向负无穷方向舍入 |
ROUND_HALF_DOWN | 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5 |
ROUND_HALF_EVEN | 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,如果保留位数是奇数,使用ROUND_HALF_UP,如果是偶数,使用ROUND_HALF_DOWN |
ROUND_HALF_UP | 向(距离)最近的一边舍入,除非两边(的距离)是相等,如果是这样,向上舍入, 1.55保留一位小数结果为1.6 |
ROUND_UNNECESSARY | 计算结果是精确的,不需要舍入模式 |
ROUND_UP | 向远离0的方向舍入 |
声明赋值
和BigInteger类似,有两种方法
String bigNum1 = "5.6";
BigDecimal big1 = new BigDecimal(bigNum1);
double bigNum2 =2.3;
BigDecimal big2 = BigDecimal.valueOf(bigNum2);2);
常用方法
除了除法规则以外其余和BIgInteger类似,如下所示:
// BigDecimal的加法
BigDecimal bigAdd = big1.add(big2);
// BigDecimal的减法
BigDecimal bigSub = big1.subtract(big2);
// BigDecimal的乘法
BigDecimal bigMul = big1.multiply(big2);
BigDecimal除法规则
BigDecimal.divide(BigDecimal divisor, int scale, RoundingMode roundingMode) ;
scale为小数位数,roundingMode为小数模式(舍/入模式),共有八种模式。
// BigDecimal的除法使用规则
BigDecimal bigD0 = new BigDecimal(-1);
BigDecimal bigD1 = new BigDecimal(1);
BigDecimal bigD10 = new BigDecimal(2);
BigDecimal bigD2 = new BigDecimal(3);
//向正无穷方向舍入
BigDecimal bigDiv1 = bigD1.divide(bigD2,10,BigDecimal.ROUND_CEILING);
System.out.println("1/3 向正无穷方向舍入:"+bigDiv1);
//向零方向舍入
BigDecimal bigDiv2 = bigD1.divide(bigD2,10,BigDecimal.ROUND_DOWN);
System.out.println("1/3 向零方向舍入:"+bigDiv2);
BigDecimal bigDiv3 = bigD0.divide(bigD2,10,BigDecimal.ROUND_DOWN);
System.out.println("-1/3 向零方向舍入:"+bigDiv3);
//向负无穷方向舍入ROUND_FLOOR
BigDecimal bigDiv4 = bigD0.divide(bigD2,10,BigDecimal.ROUND_FLOOR);
System.out.println("-1/3 向负无穷方向舍入:"+bigDiv4);
//向距离近的一边舍入,如果是这样,向下舍入, 例如1.55 保留一位小数结果为1.5,ROUND_HALF_DOWN
//0.33333333333向0舍入,为0.3333333333
BigDecimal bigDiv5 = bigD1.divide(bigD2,10,BigDecimal.ROUND_HALF_DOWN);
System.out.println("1/3 向距离近的一边舍入:"+bigDiv5);
//0.66666666666向1舍入,为0.6666666667
BigDecimal bigDiv6 = bigD10.divide(bigD2,10,BigDecimal.ROUND_HALF_DOWN);
System.out.println("2/3 向距离近的一边舍入:"+bigDiv6);
//计算结果是精确的,不需要舍入模式,ROUND_UNNECESSARY,若为1/3,则会报错
BigDecimal bigDiv7 = bigD2.divide(bigD1,10,BigDecimal.ROUND_UNNECESSARY);
System.out.println("3/1 计算结果是精确的,不需要舍入模式:"+bigDiv7);
//向远离0的方向舍入ROUND_UP
BigDecimal bigDiv8 = bigD1.divide(bigD2,10,BigDecimal.ROUND_HALF_DOWN);
System.out.println("1/3 向远离0的方向舍入:"+bigDiv8);
BigDecimal bigDiv9 = bigD0.divide(bigD2,10,BigDecimal.ROUND_HALF_DOWN);
System.out.println("-1/3 向远离0的方向舍入:"+bigDiv9);
BigDecimal bigDiv10 = bigD10.divide(bigD2,10,BigDecimal.ROUND_HALF_DOWN);
System.out.println("2/3 向远离0的方向舍入:"+bigDiv10);
BigDecimal bigDiv11 = bigD10.divide(bigD2,10,BigDecimal.ROUND_HALF_DOWN);
System.out.println("-2/3 向远离0的方向舍入:"+bigDiv11);
//计算结果
1/3 向正无穷方向舍入:0.3333333334
1/3 向零方向舍入:0.3333333333
-1/3 向零方向舍入:-0.3333333333
-1/3 向负无穷方向舍入:-0.3333333334
1/3 向距离近的一边舍入:0.3333333333
2/3 向距离近的一边舍入:0.6666666667
3/1 计算结果是精确的,不需要舍入模式:3.0000000000
1/3 向远离0的方向舍入:0.3333333333
-1/3 向远离0的方向舍入:-0.3333333333
2/3 向远离0的方向舍入:0.6666666667
-2/3 向远离0的方向舍入:0.6666666667