一、BigInteger(操作整型)
为什么要引入BigInteger类?
在 Java 中,有许多数字处理的类,比如 Integer类,但是Integer类有一定的局限性,我们都知道 Integer 是 Int 的包装类,int 的最大值为2^31-1,若希望描述更大的整数数据时,使用Integer 数据类型就无法实现了,所以Java中提供了BigInteger 类;BigInteger类型的数字范围较Integer,Long类型的数字范围要大得多,它支持任意精度的整数,也就是说在运算中,BigInteger类型可以准确地表示任何大小的整数值而不会丢失任何信息。
- BigInteger类位于java.math包中
- 在操作的时候一个整型数据已经超过了整数的最大类型长度long的话,则此数据就无法装入,此时要使用BigInteger类进行操作
1.构造方法
public BigInteger(String val)
- 将一个字符串变成BigInteger类型的数据
2.基本运算方法
add(),subtract(),multiply(),divide()
①public BigInteger add(BigInteger val)
- 加法
②public BigInteger subtract(BigInteger val)
- 减法
③public BigInteger multiplyt(BigInteger val)
- 乘法
④public BigInteger divide(BigInteger val)
- 除法
⑤public BigInteger max(BigInteger val)
- 返回两个大数字中的最大值
⑥public BigInteger min(BigInteger val)
- 返回两个大数字中的最小值
代码示例:
import java.math.BigInteger;
public class BigIntegerDemo1 {
public static void main(String[] args) {
/*
BigInteger 大整数
long 8个字节 最大值:9223372036854775807
*/
// long n = 9223372036854775808L;
// 声明BigInteger对象
BigInteger b1 = new BigInteger("9223372036854775808111") ;
BigInteger b2 = new BigInteger("2222222222222222222222") ;
// 加法操作
BigInteger b3 = b1.add(b2);
System.out.println(b3);// 11445594259076998030333
// 减法操作
BigInteger b4 = b1.subtract(b2);// 7001149814632553585889
System.out.println(b4);
// 乘法操作
BigInteger b5 = b1.multiply(b2);// 20496382304121724018022394806214032272042642
System.out.println(b5);
// 除法操作
BigInteger b6 = b1.divide(b2);
System.out.println(b6);// 4(divide()方法本身只是把最终的商保存下来了)
// 求出最大数
BigInteger b7 = b1.max(b2);
System.out.println(b7);// 9223372036854775808111
// 求出最小数
BigInteger b8 = b1.min(b2);
System.out.println(b8);//2222222222222222222222
}
}
二、BigDecimal(操作小数)
为什么要引入BigDecimal类?
在计算机中不论是float还是double都是浮点数,而计算机是二进制的,浮点数会失去一定的精确度;根本原因是:十进制值通常没有完全相同的二进制表示形式;十进制数的二进制表示形式可能不精确,只能无限接近于那个值。
- Java在java.math包中提供的API类BigDecimal
- 对于不需要任何准确计算精度的程序可以直接使用float或double完成,但是如果需要精确计算结果,则必须使用BigDecimal类。
十进制二进制转换图:
public class BigDecimalDemo {
public static void main(String[] args) {
System.out.println(12-11.9);//0.09999999999999964
}
}
但是,在项目中,我们不可能让这种情况出现,特别是金融项目,因为涉及金额的计算都必须十分精确,你想想,如果你的支付宝账户余额显示193.99999999999998,那是一种怎么样的体验?因此,java为我们提供了BigDecimal类。
1.构造方法
public BigDecimal(String val)
- 将字符串表示形式转换为BigDecimal
2.基本运算方法
add(),subtract(),multiply(),divide()
①public BigDecimal add(BigDecimal val)
- 加法
②public BigDecimal subtract(BigDecimal val)
- 减法
③public BigDecimal multiplyt(BigDecimal val)
- 乘法
④public BigDecimal divide(BigDecimal divisor,int scale,int roundingMode)
- 除法
- int scale代表精度,int roundingMode代表舍入模式 比如:四舍五入
代码示例:
import java.math.BigDecimal;
public class BigDecimalDemo {
/*
BigDecimal 大浮点
*/
public static void main (String[]args){
System.out.println(12-11.9);//0.09999999999999964
BigDecimal b1 = new BigDecimal("12");
BigDecimal b2 = new BigDecimal("11.9");
//加法
System.out.println(b1.add(b2));// 23.9
//减法
System.out.println(b1.subtract(b2));// 0.1
//乘法
System.out.println(b1.multiply(b2));//142.8
//除法
//System.out.println(b1.divide(b2));// 此时的结果是一个无限循环小数,程序会报错,所以需要指定精度和舍入模式
// 精度 舍入模式
System.out.println(b1.divide(b2, 3, BigDecimal.ROUND_CEILING));// 1.009
}
}