1 什么是大数字类
在Java中,基本数据类型中整型最大范围是64位long型整数。但在实际应用中,可能需要存储超过该范围的整型数字,或者对超过该范围的多个整型数字进行计算。例如,在密码学中需要使用512位的整型数字作为密钥。Java中提供了BigInteger类来表示任意大小的整数,提供了BigDecimal类来表示任意大小且精度完全准确的浮点数。
BigInteger和BigDecimal被称为Java中的大数字类,位于java.math包下,两个类均为Number类的子类。大数字类除了可以表示大数字以外,还提供了大数字的各类运算方法,如四则运算、幂运算等。
2 BigInteger示例
编写代码,测试BigInteger类的用法。代码示意如下:
package api_02;
import java.math.BigInteger;
public class BigIntegerDemo {
public static void main(String[] args) {
// 创建BigInteger对象,封装大整数
BigInteger i1 = new BigInteger("1234567890");
BigInteger i2 = new BigInteger("12345678901234567890");
BigInteger result1 = i1.add(i2); // 12345678902469135780
System.out.println("result1= " + result1);
BigInteger result2 = i1.multiply(i2); // 15241578751714678875019052100
System.out.println("result2= " + result2);
long l1 = result2.longValue(); // 转换为long类型,超范围会导致精度缺失
System.out.println("l1="+l1); // -4871824193159134140
// 转换为long类型,超范围会抛出异常
long l2 =result2.longValueExact(); // BigInteger out of long range
}
}
3 BigDecimal示例
编写代码,测试BigDecimal类的用法。代码示意如下:
package api_02;
import java.math.BigDecimal;
import java.math.RoundingMode;
public class BigDecimalDemo {
public static void main(String[] args) {
BigDecimal d1 = new BigDecimal("123.4567");
BigDecimal d2 = d1.multiply(d1);
System.out.println(d2); // 15241.55677489
// BigDecimal用scale()表示小数位数
BigDecimal d3 = new BigDecimal("12.34");
BigDecimal d4 = new BigDecimal("12.3400");
BigDecimal d5 = new BigDecimal("123400");
System.out.println(d3.scale()); // 2
System.out.println(d4.scale()); // 4
System.out.println(d5.scale()); // 0
// 可以对一个BigDecimal设置它的scale
// 如果精度比原始值低,那么按照指定的方法进行四舍五入或者直接截断
BigDecimal d6 = d1.setScale(2, RoundingMode.HALF_UP);
BigDecimal d7 = d1.setScale(2, RoundingMode.DOWN);
System.out.println(d6); // 123.46
System.out.println(d7); // 123.45
// 在比较两个BigDecimal的值是否相等时,
// 使用equals()方法不但要求的值相等,还要求scale()相等
BigDecimal d8 = new BigDecimal("123.456");
BigDecimal d9 = new BigDecimal("123.45600");
System.out.println(d8.equals(d9));
// 应该使用compareTo()比较两个BigDecimal的值
System.out.println(d8.compareTo(d9)); // 0 表示相等
}
}
4 如何精确处理小数
BigDecimal是Java中的一个类,用于进行高精度的数值计算。它提供了一种精确表示和操作任意精度的十进制数的方式,避免了使用浮点数在精度和舍入误差上可能存在的问题。
下面是一个示例,说明BigDecimal如何比double更准确:
public class BigDecimalExample {
public static void main(String[] args) {
double num1 = 0.1;
double num2 = 0.2;
double sum1 = num1 + num2;
System.out.println("Sum using double: " + sum1); // 输出结果: 0.30000000000000004
BigDecimal decimal1 = new BigDecimal("0.1");
BigDecimal decimal2 = new BigDecimal("0.2");
BigDecimal sum2 = decimal1.add(decimal2);
System.out.println("Sum using BigDecimal: " + sum2); // 输出结果: 0.3
}
}
在上述示例中,使用double类型进行0.1和0.2的相加,由于浮点数的精度限制,计算结果会产生舍入误差,得到一个略微不准确的结果。而使用BigDecimal进行相加时,精确地表示了0.1和0.2,并得到了准确的计算结果。
这个例子说明了在需要精确计算时,特别是涉及到货币、财务或其他需要准确小数表示的场景时,使用BigDecimal更可靠,避免了浮点数带来的舍入误差。