大数类
1.大数类基本概述
Java在设计的时候就考虑到了一些特殊的应用环境,当一个数字非常大的时候,是无法用基本数据类型接收的,所以专门设计了大数字处理类。在早期开发中如果遇到大数字的时候往往会使用String类进行接收,之后使用拆分的方式进行计算。但是,这一系列的操作过于繁琐,所以为了解决这样的难题,在java.lang.Math包中提供了大数字的操作类:BigInteger(整数)、BigDecimal(浮点数),这两个类都是Number子类。其继承图如下:
2.BigInteger类的常用方法
方法 | 类型 | 描述 |
---|---|---|
public BigInteger(String val) | 构造 | 将一个字符串变为BigInteger类型的数据 |
public BigInteger add(BigInteger val) | 普通 | 加法计算 |
public BigInteger subtract(BigInteger val) | 普通 | 减法计算 |
public BigInteger multiply(BigInteger val) | 普通 | 乘法计算 |
public BigInteger divide(BigInteger val) | 普通 | 除法计算 |
public BigInteger max(BigInteger val) | 普通 | 返回两个大数字中的最大值 |
public BigInteger min(BigInteger val) | 普通 | 返回两个大数字中的最小值 |
public BigInteger[] divideAndRemainder(BigInteger val) | 普通 | 除法操作:数组的第一个元素为商,第二个元素为余数 |
案例:使用BigInteger实现四则运算
public class BigIntegerTestDemo {
public static void main(String[] args){
BigInteger bigIntegerNumber01 = new BigInteger("25");
BigInteger bigIntegerNumber02 = new BigInteger("4");
System.out.println("bigIntegerNumber01:" + bigIntegerNumber01);
System.out.println("bigIntegerNumber02:" + bigIntegerNumber02);
System.out.println("加法操作:" + bigIntegerNumber01.add(bigIntegerNumber02));
System.out.println("减法操作:" + bigIntegerNumber01.subtract(bigIntegerNumber02));
System.out.println("乘法操作:" + bigIntegerNumber01.multiply(bigIntegerNumber02));
System.out.println("除法操作:" + bigIntegerNumber01.divide(bigIntegerNumber02));
BigInteger[] result = bigIntegerNumber01.divideAndRemainder(bigIntegerNumber02);
System.out.println("商:" + result[0] + ",余数:" + result[1]);
}
}
/*
输出结果:
bigIntegerNumber01:25
bigIntegerNumber02:4
加法操作:29
减法操作:21
乘法操作:100
除法操作:6
商:6,余数:1
*/
上述例子基于BigInteger类实现了基础四则运算,可以发现实例化BigInteger类对象时的数据类型为String,这样就可以不受数据类型长度的限制。
3.BigDecimal类的常用方法
方法 | 类型 | 描述 |
---|---|---|
public BigDecimal(double val) | 构造 | 将double类型转换为BigDecimal |
public BigDecimal(int val) | 构造 | 将int类型转换为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) | 普通 | 除法计算 |
public BigDecimal divide(BigDecimal divisor, int scale, RoundingMode roundingMode) | 普通 | 除法计算设置保留小数位与进位模式 |
tips:在创建BigDecimal实例化对象的时,构造方法优先选择java.math.BigDecimal.BigDecimal(String val)。
因为,当使用double作为构造方法参数的时候,由于我们传入的值无法精确作为一个double类型,所以可能会出现我们不希望的结果,其精度不可控。 如下:
public class CreateBigDecimalTestDemo {
public static void main(String[] args) {
double num01 = 12.34;
int num02 = 12;
//double类型
BigDecimal number01 = new BigDecimal(num01);
//String类型
BigDecimal number02 = new BigDecimal(String.valueOf(num01));
//int类型
BigDecimal number03 = new BigDecimal(num02);
System.out.println("number01:" + number01);
System.out.println("number02:" + number02);
System.out.println("number03:" + number03);
}
}
/*
输出结果:
number01:12.339999999999999857891452847979962825775146484375
number02:12.34
number03:12
*/
由上测试可得:String类型为参数的构造方法是完全可预知的:写入new BigDecimal(“0.1”) 将创建一个BigDecimal对象,它正好等于预期的 0.1。因此,通常建议优先使用String构造方法。倘若,必须以double类型用作构造函数的参数时,可先将doule类型转换为String,String.value(double double)转成String类型,然后使用BigDecimal的参数为String类型的构造方法。
BigDecimal类与BigInteger类的操作形式类似,但是BigDecimal类中提供有一个进位的除法操作,可以利用此方法实现四舍五入处理。
案例:使用BigDecimal实现四舍五入
class MathUtil {
private MathUtil() {
}
/**
* 实现数据的四舍五入操作
* @return 四舍五入处理后的结果
* @parm num 要进行四舍五入操作的数字
* @parm scale 四舍五入保留的小数位数
*/
public static double round(String num, int scale) {
//数字除以1.0还是数字本身,divide()方法保留指定位数的小数,并设置进位模式为向上进位(HELF_UP)
return new BigDecimal(num).divide(new BigDecimal("1.0"), scale, RoundingMode.HALF_UP).doubleValue();
}
}
public class BigDecimalTestDemo {
public static void main(String[] args) {
double number = 19.5364;
System.out.println(number + "保留两位:" + MathUtil.round(String.valueOf(number), 2));
System.out.println(number + "保留三位:" + MathUtil.round(String.valueOf(number), 3));
}
}
/*
输出结果:
19.5364保留两位:19.54
19.5364保留三位:19.536
*/
上述例子主要是利用BigDecimal类的divide()除法操作实现了准确的小数位数保留,同时利用向上进位模式实现了四舍五入操作。
注:此文章只是在学习过程中为加深自身理解做的笔记,其中有些方法已经被已经被弃用。