在Java中提供了大数字的操作类,即java.math.BigInteger类与java.math.BigDecimal类。这两个类用于高精度计算,其中BigInteger类是针对大整数的处理类,而BigDecimal类则是针对大小数的处理类。
1.BigInteger
BigInteger支持任意精度的整数,也就是说在运算中BigInteger类型可以准确表示任何大小的整数值而不会丢失任何信息。
BigInteger类具有很多构造函数,但最直接的一种方式是参数以字符串形式代表要处理的数字。
public BigInteger(String val); //其中val是十进制字符串
几种常用运算方法:
public BigInteger add(BigInteger val): 做加法运算
public BigInteger subtract(BigInteger val): 做减法运算
public BigInteger multiply(BigInteger val): 做乘法运算
public BigInteger divide(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
public BigInteger min(BigInteger val):返回较小的数值
public BigInteger max(BigInteger val):返回较大的数值
2.BigDecimal
BigDecimal类支持任何精度的定点数,可以用它来精确计算货币值。
在BigDecimal类中常用的两个构造方法如下:
public BigDecimal(double val):实例化时将双精度型转换为BigDecimal类型。
public BigDecimal(String val):实例化时将字符串形式转换为BigDecimal类型。
public BigDecimal add(BigDecimal augend):做加法操作
public BigDecimal subtract(BigDecimal subtrahend):做减法操作
public BigDecimal multiply(BigDecimal multiplicand):做乘法操作
public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode):做除法操作,
方法中3个参数分别代表除数、商的小数点后的位数、近似处理模式
BigDecimal类中divide()方法的多种处理模式
模式 |
含义 |
BigDecimal.ROUND_UP | 商的最后一位如果大于0,则向前进位,正负数都如此 |
BigDecimal.ROUND_DOWN | 商的最后一位无论是什么数字都省略 |
BigDecimal.ROUND_CEILING | 商如果是正数,按照ROUND_UP模式处理;如果是负数,按照ROUND_DOWN模式处理。这种模式的处理都会使近似值大于等于实际值 |
BigDecimal.ROUND_FLOOR | 与ROUND_CEILING模式相反,商如果是正数,按照ROUND_DOWN模式处理;商如果是负数,则按照ROUND_UP模式处理。这种模式的处理都会使近似值小于等于实际值 |
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 hello;
import java.math.BigDecimal;
public class BigDecimalDemo {
static final int location = 10;
/**
* 定义加法方法,参数为加数与被加数
*
* @param value1
* 相加的第一个数
* @param value2
* 相加的第二个数
* @return 两数之和
*/
public BigDecimal add(double value1, double value2) {
// 实例化Decimal对象
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.add(b2); // 调用加法方法
}
/**
* 定义减法方法,参数为减数与被减数
*
* @param value1
* 被减数
* @param value2
* 减数
* @return 运算结果
*/
public BigDecimal sub(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.subtract(b2); // 调用减法方法
}
/**
* 定义乘法方法,参数为乘数与被乘数
*
* @param value1
* 第一个乘数
* @param value2
* 第二个乘数
* @return
*/
public BigDecimal mul(double value1, double value2) {
BigDecimal b1 = new BigDecimal(Double.toString(value1));
BigDecimal b2 = new BigDecimal(Double.toString(value2));
return b1.multiply(b2); // 调用乘法方法
}
/**
* 定义除法方法,参数为除数与被除数
*
* @param value1 被除数
* @param value2 除数
* @return
*/
public BigDecimal div(double value1, double value2) {
return div(value1, value2, location); // 调用自定义除法方法
}
// 定义除法方法,参数分别为除数与被除数以及商小数点后的位数
public BigDecimal div(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));
// 调用除法方法,商小数点后保留b位,并将结果进行四舍五入操作
return b1.divide(b2, b, BigDecimal.ROUND_HALF_UP);
}
public static void main(String[] args) {
BigDecimalDemo b = new BigDecimalDemo();
System.out.println("两个数字相加结果:" + b.add(-7.5, 8.9));
System.out.println("两个数字相减结果:" + b.sub(-7.5, 8.9));
System.out.println("两个数字相乘结果:" + b.mul(-7.5, 8.9));
System.out.println("两个数字相除结果,结果小数后保留10位:"+b.div(10, 2));
System.out.println("两个数字相除,保留小数后5位:"+b.div(-7.5,8.9, 5));
}
}