16.java核心类:BigInteger和BigDecimal

2025-05-21  本文已影响0人  呦丶耍脾气

BigInteger

定义与运算

java.math.BigInteger就是用来表示任意大小的整数。BigInteger内部用一个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 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

BigIntegerIntegerLong一样,也是不可变类,并且也继承自Number类。因为Number定义了转换为基本类型的几个方法:

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

BigDecimalscale()获取小数位数,如果返回负数,表示这个数是个整数,并且末尾有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()都相等

上一篇 下一篇

猜你喜欢

热点阅读