概述
java中的大数有两类,一个是存储整形的BigInteger,一个是存储浮点型的BigDecimal,它们本质上是由字符串构成的,因此可以存储任意长度的数据,但他们使用起来要比基本类型麻烦,并且速度肯定亚于基本数据类型。
特性
1.BigInteger和BigDecimal都可以使用静态方法valueOf()来进行对象的创建和初始化。
public class BigData {
public static void main(String[] args){
BigInteger integer = BigInteger.valueOf(1);
BigDecimal decimal = BigDecimal.valueOf(0.1);
System.out.println(integer);
System.out.println(decimal);
}
}
2.都可以使用new方法传递字符串型的数据构造相应对象。
public class BigData {
public static void main(String[] args){
BigInteger integer1 = new BigInteger("1");
BigDecimal decimal1 = new BigDecimal("0.1");
System.out.println(integer1);
System.out.println(decimal1);
}
}
3.BigInteger虽然有以long型为入参的构造方法,但它是私有构造方法的,不能直接使用。
4.BigDecimal支持以double为入参构造对象,但需要注意的是,虽然BigDecimal提供了以double类型为入参的构造方法,但请不要使用它,因为这可能会引起错误,其深层原因是很多浮点数不能精确地以二进制的形式表示,比如0.1,在转换时会导致精度丢失。
public class BigData {
public static void main(String[] args){
//BigInteger integer2 = new BigInteger(1); //ERROR
BigDecimal decimal2 = new BigDecimal(0.1); //don't do it
//System.out.println(integer2);
System.out.println(decimal2);
//输出为0.1000000000000000055511151231257827021181583404541015625
}
}
5.java的大数提供了加减乘除等方法去代替常规的运算符,分别为add()、substract()、multiple()、divide(),以及compareTo()方法对两个大数进行比较,比较的入参必须是同类型的大数。
6.对于BigInteger,常用的方法还有:取余mod()、开平方sqrt()。
7.对于BigDecimal,常用的方法还有一个根据指定规则进行舍入的除法运算,比如说四舍五入即为BigDecimal.HALF_UP,常用的还有HALF_DOWN,CEILING、FLOOR。形式如下:
BigDecimal divide(BigDecimal divisor, int scale, int roundingMode)
其中scale为精确到小数点后几位,这个参数也可以不使用。
经验总结
1.创建java大数类型时,不能直接使用new的方式并传入一个基本数据类型(包括包装类),而应传入字符串类型,你也可以使用包装类型的toString方法。
2.若要以基本数据类型创建大数对象,请使用静态方法valueOf()进行传递。