BigInteger
定义与运算
java.math.BigInteger
就是用来表示任意大小的整数。BigIntege
r内部用一个int[]
数组来模拟一个非常大的整数:
BigInteger bi = new BigInteger("1234567890");
System.out.println(bi.pow(5)); // 2867971860299718107233761438093672048294900000
对BigInteger做运算的时候,只能使用实例方法,例如,加法运算:
BigInteger i1 = new BigInteger("1234567890");
BigInteger i2 = new BigInteger("12345678901234567890");
BigInteger sum = i1.add(i2); // 12345678902469135780
和
long
型整数运算比,BigInteger
不会有范围限制,但缺点是速度比较慢。
转换
- BigInteger转换成long型
BigInteger i = new BigInteger("123456789000");
System.out.println(i.longValue()); // 123456789000
System.out.println(i.multiply(i).longValueExact()); // java.lang.ArithmeticException: BigInteger out of long range
使用
longValueExact()
方法时,如果超出了long
型的范围,会抛出ArithmeticException
BigInteger
和Integer
、Long
一样,也是不可变类,并且也继承自Number
类。因为Number
定义了转换为基本类型的几个方法:
- 转换为byte:byteValue()
- 转换为short:shortValue()
- 转换为int:intValue()
- 转换为long:longValue()
- 转换为float:floatValue()
- 转换为double:doubleValue()
BigInteger
表示的范围超过了基本类型的范围,转换时将丢失高位信息,即结果不一定是准确的。如果需要准确地转换成基本类型,可以使用intValueExact()
、longValueExact()
等方法,在转换时如果超出范围,将直接抛出ArithmeticException
异常。
BigDecimal
定义
和BigInteger类似,BigDecimal可以表示一个任意大小且精度完全准确的浮点数。
BigDecimal bd = new BigDecimal("123.4567");
System.out.println(bd.multiply(bd)); // 15241.55677489
System.out.println(bd.scale()); // 4,四位小数
BigDecimal d1 = new BigDecimal("123.4500");
BigDecimal d2 = d1.stripTrailingZeros();
System.out.println(d1.scale()); // 4
System.out.println(d2.scale()); // 2,因为去掉了00
BigDecimal d3 = new BigDecimal("1234500");//1234500
BigDecimal d4 = d3.stripTrailingZeros();//1.2345E+6
System.out.println(d3.scale()); // 0
System.out.println(d4.scale()); // -2
BigDecimal
用scale()
获取小数位数,如果返回负数,表示这个数是个整数,并且末尾有2个0。
stripTrailingZeros()
方法,可以将一个BigDecimal
格式化为一个相等的,但去掉了末尾0的BigDecimal
四舍五入或者直接截断
setScale
BigDecimal d5 = new BigDecimal("1234500.1545452");
System.out.println(d5.setScale(3, RoundingMode.HALF_UP));//1234500.155 四舍五入
System.out.println(d5.setScale(3, RoundingMode.DOWN));//1234500.154 截取
运算
BigDecimal d1 = new BigDecimal("123.456");
BigDecimal d2 = new BigDecimal("23.456789");
System.out.println(d1.add(d2));//加 146.912789
System.out.println(d1.subtract(d2));//减 99.999211
System.out.println(d1.multiply(d2));// 乘 2895.881342784
BigDecimal[] ds = d1.divideAndRemainder(d2);
System.out.println(ds[0]);//商 5
System.out.println(ds[1]);//余数 6.172055
if (dr[1].signum() == 0) {
// d1 是d2的整数倍
}
System.out.println(d1.divide(d2, 10, RoundingMode.HALF_UP)); // 保留10位小数并四舍五入
System.out.println(d1.divide(d2)); // 报错:ArithmeticException,因为除不尽
比较BigDecimal
compareTo()
值相等,返回正数=等于,负数=小于,0=等于
equals()
值和scale()都相等