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);
	}
}

【结果】
在这里插入图片描述

通过上例可以看出如果数字超过该类型的最大范围则会提示“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]);

	}
}

【结果】
在这里插入图片描述

大型浮点数操作类BigDecimal

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

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));
	}
}

【结果】
在这里插入图片描述
BigDecimal.ROUND_DOWN指定商保留1位小数并输出相应的结果。
BigDecimal.ROUND_UP将两个数的乘积按照进一法保留1位小数,并输出。

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

  • 3
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值