Java中大数字的操作类:
java.math.BigInteger
java.math.BigDecimal
1.BigInteger类
Int的最大值为2^31-1,如果要处理更大的数,就必须用到BigInteger,BigInteger类中提供了加、减、乘、除、绝对值、相反数、最大公约数、判断是否为质数等方法。
使用BigInteger类,可以实例化一个BigIngeger对象,并自动调用相应的构造函数。BigInteger有很多构造函数,但是最直接的一种方式是参数以字符串的形式代表要处理的数字。
语法:
public BigInteger(String value);
将2转化为BigInteger类型:
BigInteger twoInstance = new BigInteger("2");
运算方法 | 功能描述 |
public BigInteger add(BigInteger val) | 做加法运算 |
public BigInteger subtract(BigInteger val) | 做减法运算 |
public BigInteger multiply(BigInteger val) | 做乘法运算 |
public BigInteger devide(BigInteger val) | 做除法运算 |
public BigInteger remainder(BigInteger val) | 做取余操作 |
public BigInteger[] divideAndRemainder(BigInteger val) | 用数组返回商和余数,结果数组中第一个值为商,第二个数为余数 |
public BigInteger pow(int exponent) | 进行取参数的exponent操作 |
public BigInteger negate() | 取相反数 |
public BigInteger shiftLeft(int n) | 将数字左移n位,如果n为负数,做右移操作 |
public BigInteger shiftRight(int n) | 将数字右移n位,如果n为负数,做左移操作 |
public BigInteger and(BigInteger val) | 做与操作 |
public BigInteger or(BigInteger val) | 做或操作 |
public int compareTo(BigInteger val) | 做数字比较操作 |
public boolean equals(Object x) | 当x是BigInteger类型的数字且数值相等时,返回true,否则返回false |
public BigInteger min(BigInteger val) | 返回较小的数值 |
public BigInteger max(BigInteger val) | 返回较大的数值 |
package MathInfo;
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
BigInteger bigInstance = new BigInteger("4");
//将该数+2操作
System.out.println("加法操作:" + bigInstance.add(new BigInteger("2"))); //加法操作:6
//将该数-2操作
System.out.println("减法操作:" + bigInstance.subtract(new BigInteger("2"))); //减法操作:2
//将该数*2操作
System.out.println("乘法操作:" + bigInstance.multiply(new BigInteger("2"))); //乘法操作:8
//将该数➗2操作
System.out.println("除法操作:" + bigInstance.divide(new BigInteger("2"))); //除法操作:2
//该数÷3的商
System.out.println("取商操作:" + bigInstance.divideAndRemainder(new BigInteger("3"))[0]); //取商操作:1
//该大数字÷3的余数
System.out.println("大数字取余操作:" + bigInstance.divideAndRemainder(new BigInteger("3"))[1]); //大数字取余操作:1
//该大数字的2次方
System.out.println("该大数字的2次方:" + bigInstance.pow(2)); //该大数字的2次方:16
//该大数字的相反数
System.out.println("该大数字的相反数:" + bigInstance.negate()); //该大数字的相反数:-4
}
}
2.BigDecimal类
java.math.BigDecimal类支持任何精度的定点数,适用与float和double类型数据来做科学计算、货币计算等。
BigDecimal型的数字可以用来做超大浮点数的运算,包括加、减、乘、除等,在所有运算中,除法是最复杂的,因为在除不尽的情况下,末尾小数点的处理需要被考虑。
2.1 构造方法:
2.1.1 public BigDecimal(double val)
实例化时将双精度型转换为BigDecimal类型
2.1.2 public BigDecimal(String val)
实例化时将字符串型转换为BigDecimal类型
方法 | 功能说明 |
public BigDecimal add(BigDecimal augend) | 加法操作 |
public BigDecimal subtract(BigDecimal subtrahend) | 减法操作 |
public BigDecimal multiply(BigDecimal multiplicand) | 乘法操作 |
public BigDecimal devide(BigDecimal divisor, int scale, int roundingMode) | 除法操作,参数分别代表:除数,商的小数点后的位数,近似处理模式 |
BigDecimal类中的divide()方法有多种设置,用于返回商末位小数点的处理,如:
模式 | 含义 |
BigDecimal.ROUND_UP | 商的最后一位若大于0,则向前进位,正负数都如此 |
BigDecimal.ROUND_DOWN | 商的最后一位无论是什么数字,都省略 |
BigDecimal.ROUND_CEILING | 商如果是正数,按照ROUND_UP处理,如果是负数,按照ROUND_DOWN处理。这2种模式的处理都会使近似值大于等于实际值 |
BigDecimal.ROUND_FLOOR | 与ROUND_CEILING相反,商如果是正数,按照ROUND_DOWN处理,如果是负数,按照ROUND_CEILING处理。这2种模式的处理都会使近似值小于等于实际值 |
BigDecimal.ROUND_HALF_DOWN | 对商进行四舍五入操作,如果商最后一位小于等于5,则做舍弃操作;若最后一位大于5,则做进位操作,如7.5≈7 |
BigDecimal.ROUND_HALF_UP | 对商进行四舍五入操作,如果商最后一位小于5,则做舍弃操作;若最后一位大于等于5,则做进位操作,如7.5≈8 |
BigDecimal.ROUND_HALF_EVEN | 如果商的倒数第二位为奇数,则按照ROUND_HALF_UP处理;如果商的倒数第二位为偶数,则按照ROUND_HALF_DOWN处理;如7.5≈8, 8.5≈8 |
/**
* 实现加减乘除
*/
package MathInfo;
import java.math.BigDecimal;
public class BigDecimalDemo {
static final int location = 10;
//定义加法
public BigDecimal add(double value1, double value2) {
// BigDecimal b1 = new BigDecimal(value1); //不能用这种方法,最后相加结果小数位非常多,不精确
// BigDecimal b2 = new BigDecimal(value2);
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2);
}
//定义减法
public BigDecimal subTract(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.subtract(b2);
}
//定义乘法
public BigDecimal multiPly(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.multiply(b2);
}
//定义除法,参数为除数与被除数以及商小数点后位数
public BigDecimal myDivide(double value1, double value2, int b) {
if (b < 0) {
System.out.println("b必须大于等于0!");
}
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
//调用divide方法,商后保留b位小数,并做四舍五入操作
return b1.divide(b2, b, BigDecimal.ROUND_HALF_UP);
}
public BigDecimal myDivide(double value1, double value2) {
return myDivide(value1, value2, location);
}
public static void main(String[] args) {
BigDecimalDemo b = new BigDecimalDemo();
System.out.println("两个数字相加结果:" + b.add(-7.5, 8.9)); //两个数字相加结果:1.4
System.out.println("两个数字相减结果:" + b.subTract(8, 8.9)); //两个数字相减结果:-0.9
System.out.println("两个数字相乘结果:" + b.multiPly(8, -2)); //两个数字相乘结果:-16.00
System.out.println("两个数字相除结果:" + b.myDivide(10, 2)); //两个数字相除结果:5.0000000000
System.out.println("两个数字相除结果,保留后面5位小数:" + b.myDivide(10, 3, 5)); //两个数字相除结果,保留后面5位小数:3.33333
}
}