Java中的大数字处理类

Java在设计时考虑到了一些特殊的应用环境,所以专门设计了大数字类,本课程主要讲解了大数字的操作形式以及BigInteger类和BigDecimal类的操作处理。

如果说现在要是进行正常的程序开发,基本上程序语言里面所提供数据类型都够能够满足开发人员的需求,而且在整个的编程语言里面中的double数据类型可以保存的范围是非常庞大的(double保存数据范围:4.9E-324 ~ 1.7976931348623157E308),但是如果说现在某些的程序计算里面有可能需要执行更大的数字计算操作,那么这种情况下就不可能采用常规的形式完成处理了,所以按照传统编程语言设计的模型来讲,此时一般都会利用字符串实现大数字数据的保存(利用字符的操作模拟实现各种数学计算)。为了解决这样的设计专门提供了一个java.math的包,而在这个包里面提供有两个程序类:BigInteger(大整数操作类)、BigDecimal(大小数操作类)。

1 BigInteger类的使用

如果要想使用BigInteger,那么就需要通过构造方法来进行BigInteger类对象的实例化,此类的构造方法定义如下:

public BigInteger(String val)

在使用BigInteger的时候需要明确的传入一个字符串,而这个字符串所包含的就是一个大数字的信息,当获取了BigInteger类的对象实例之后就可以利用其本身提供的方法实现各种数学计算。

范例:通过BigInteger类实现四则运算

package

com.yootk.demo;

import

java.math.BigInteger;

public class YootkDemo { // 李兴华编程训练营:

yootk

public static void main(String[] args) throws

Exception {

BigInteger bigA =
new BigInteger("2378902389023") ; // 大数字类BigInteger bigB = new BigInteger("723782378") ; // 大数字类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

]);

}

}

所有的大数字类都可以完成普通计算的基本操作支持,但是如果要是想执行更加繁琐的大数字的计算操作,肯定要额外使用第三方的程序组件包来完善程序功能。

2 BigDecimal类使用

BigDecimal类所描述的是一个小数,但是这个类所具备的功能要比BigInteger丰富,尤其是在构造方法的定义上:

从构造方法本身给出的定义上来讲,BigDecimal构造实际上功能会更加的丰富,它本身所具备的处理方法形式和BigInteger是非常类似的,下面使用BigDecimal类实现四则运算。

范例:使用BigDecimal类实现四则运算

package

com.yootk.demo;

import

java.math.BigDecimal;

import

java.math.RoundingMode;

public class YootkDemo { // 李兴华编程训练营:

yootk

public static void main(String[] args) throws

Exception {

BigDecimal bigA =
new BigDecimal("2378902389023.2323231") ; // 大数字类BigDecimal bigB = new BigDecimal("723782378.7237238") ; // 大数字类System.out.println("【加法计算】"

+ bigA.add(bigB));

System.
out.println("【减法计算】"

+ bigA.subtract(bigB));

System.
out.println("【乘法计算】"

+ bigA.multiply(bigB));

System.
out.println("【除法计算】" + bigA.divide(bigB, RoundingMode.HALF_UP

));

}

}

通过当前的程序代码的执行可以非常清楚的发现,在使用BigDecimal类的处理过程之中,需要针对于除法进行四舍五入的进位配置,所以对于四舍五入的功能处理也可以通过BigDecimal类的方式来完成。

范例:通过BigDecimal实现准确位数四舍五入

package

com.yootk.util;

import

java.math.BigDecimal;

import

java.math.RoundingMode;

/**

*
该类是一个自定义的数学工具类,可以弥补Math类的不足* @author 李兴华

*/

public class

MathUtil {

private MathUtil() {} // 不存在成员属性,构造方法私有化public static double round2(double num, int

scale) {

return new BigDecimal(num).divide(new BigDecimal(1), scale, RoundingMode.HALF_UP

).doubleValue() ;

}

}

package

com.yootk.demo;

import

com.yootk.util.MathUtil;

public class YootkDemo { // 李兴华编程训练营:

yootk

public static void main(String[] args) throws

Exception {

System.
out.println(MathUtil.round2(19.56789, 2

));

}

}

使用Math类或者使用BigDecimal类都可以实现四舍五入的处理,但是相比较来讲Math类的实现针对于基本数据类型的支持还是比较合理的(毕竟可以减少不必要的对象产生)。

经过了一系列的分析之后,基本上可以确定了大数字类的基本使用,但是问题是在实际的开发过程之中,该如何去使用这两个大数字类呢?这里面需要明确的告诉大家一个重要的原则:在以后如果面临数据的精准度很高的情况下,千万不要再去使用double,把所有的double都替换为BigDecimal,如果没有非常复杂的小数计算,那么还使用普通double即可。

举报/反馈