大数字运算BigDecimal

BigDecimal和BigInteger都能实现大数字的运算,不同的是 BigDecimal加入了小数的概念。一般的float型和double型数据只可以用 来做科学计算或工程计算,但由于在商业计算中要求数字精度比较高, 所以要用到java.math.BigDecimal类。BigDecimal类支持任何精度的定点 数,可以用它来精确计算货币值。

在BigDecimal类中常用的两个构造方法如下。

  • public BigDecimal(double val):实例化时将双精度型转换为 BigDecimal类型。
  • public BigDecimal(String val):实例化时将字符串形式转换为 BigDecimal类型。

BigDecimal类型的数字可以用来做超大浮点数的运算,如加、减、 乘、除等。在所有的运算中,除法是最复杂的,因为在除不尽的情况下 末位小数点的处理是需要考虑的。

下面列举了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类中divide()方法的多种处理模式
BigDecimal类中divide()方法的多种处理模式

下面设计一个类,这个类包括任意两个Decimal类型数字的加、 减、乘、除运算方法。

【例】在项目中创建BigDecimalDemo类,在类中分别定义 add()、sub()、mul()和div()方法实现加、减、乘、除运算,并输出运算 结果。

import java.math.*;

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));
	}
}
Decimal类型数字的运算操作
Decimal类型数字的运算操作

发表评论