Java之路:大数字操作类

现在思考一个问题,如果说现在要对一个非常大的数字进行操作,并且这个数字已经超过了double的范畴,那么该如何做呢?
这个时候如果要想解决问题,唯一的做法是将数字变为字符串,之后按位进行手工的计算,自己处理进位是不是很麻烦?

而在Java里面为了简化此类操作专门提供了两大数字操作类:java.math. BigInteger、java.math.BigDecimal。

大型整数操作类BigInteger

首先看下面这个超出double的范围例子:

public class BigNum {
	public static void main(String[] args) {
		// 输出两个最大的double型数相乘的结果 
		System.out.println(Double.MAX_VALUE*Double.MAX_VALUE);
	}
}

【结果】
Java之路:大数字操作类_第1张图片

通过上例可以看出如果数字超过该类型的最大范围则会提示“Infinity”。

在BigInteger类的构造方法(public BigInteger(String val))里面已经清楚的描述出了,如果数据过大,则只能利用字符串保存,而后在BigInteger类之中提供了若干个基本的数学操作。

下面看一下BigInteger的四则运算:

public class BigNumDemo1 {
	public static void main(String[] args) throws Exception
	{
		BigInteger bigA = new BigInteger("8793247892437928"); //定义两个大的整数
		BigInteger bigB = new BigInteger("9202309");
		System.out.println("加法操作:" + bigA.add(bigB));   //对两个数进行加法操作
		System.out.println("减法操作:" + bigA.subtract(bigB)); //对两个数进行减法操作
		System.out.println("乘法操作:" + bigA.multiply(bigB)); //对两个数进行乘法操作
		System.out.println("除法操作:" + bigA.divide(bigB)); //对两个数进行除法操作
		//对两个数进行除法操作,并同时保存商与余数
		BigInteger result[] = bigA.divideAndRemainder(bigB);
		System.out.println("商:" + result[0] + ",余数:" + result[1]);

	}
}

【结果】
Java之路:大数字操作类_第2张图片

大型浮点数操作类BigDecimal

BigDecimal的实现用到了BigInteger,不同的是BigDecimal加入了小数的概念。一般的float型和Double型数据只可以用来做科学计算或者是工程计算,由于在商业计算中,要求的数字精度比较高,所以要用到java.math.BigDecimal类,它支持任何精度的定点数,可以用它来精确计算货币值。下面给出BigDecimal的一些主要方法:
Java之路:大数字操作类_第3张图片

public class BigDecimalDemo {
	public static void main(String[] args) throws Exception {
		BigDecimal bigA = new BigDecimal("8793247892437928.2"); //定义两个大的浮点数
		BigDecimal bigB = new BigDecimal("9202309.6");
		System.out.println("加法操作:" + bigA.add(bigB));   //对两个数进行加法操作
		System.out.println("减法操作:" + bigA.subtract(bigB)); //对两个数进行减法操作
		System.out.println("乘法操作:" + bigA.multiply(bigB)); //对两个数进行乘法操作
		System.out.println("除法操作:" + 
					bigA.divide(bigB, BigDecimal.ROUND_DOWN)); //对两个数进行除法操作
		System.out.println("进一法保留一位小数:" + 
					bigA.multiply(bigB).setScale(1, BigDecimal.ROUND_UP));
	}
}

【结果】
Java之路:大数字操作类_第4张图片
BigDecimal.ROUND_DOWN指定商保留1位小数并输出相应的结果。
BigDecimal.ROUND_UP将两个数的乘积按照进一法保留1位小数,并输出。

ROUND_DOWN表示舍弃一位,ROUND_UP表示进一位,ROUND_HALF_UP表示四舍五入,对于Math而言无法实现准确的位数操作,所以处理位数较大的数必须实现准确位的操作用户只有通过BigDecimal实现。

你可能感兴趣的:(Java之路)