### BigInteger

`BigInteger bi = new BigInteger("1234567890");System.out.println(bi.pow(5)); // 2867971860299718107233761438093672048294900000`

`BigInteger i1 = new BigInteger("1234567890");BigInteger i2 = new BigInteger("12345678901234567890");BigInteger sum = i1.add(i2); // 12345678902469135780`

`BigInteger i = new BigInteger("123456789000");System.out.println(i.longValue()); // 123456789000System.out.println(i.multiply(i).longValueExact()); // java.lang.ArithmeticException: BigInteger out of long range`

`​BigInteger​`​和​`​Integer​`​、​`​Long​`​一样，也是不可变类，并且也继承自​`​Number​`​类。因为​`​Number​`​定义了转换为基本类型的几个方法：

• 转换为​`​byte​`​：​`​byteValue()​`
• 转换为​`​short​`​：​`​shortValue()​`
• 转换为​`​int​`​：​`​intValue()​`
• 转换为​`​long​`​：​`​longValue()​`
• 转换为​`​float​`​：​`​floatValue()​`
• 转换为​`​double​`​：​`​doubleValue()​`

`// BigInteger to floatimport java.math.BigInteger;`

Run

### 小结

`​BigInteger​`​用于表示任意大小的整数；

`​BigInteger​`​是不变类，并且继承自​`​Number​`​；

`BigDecimal bd = new BigDecimal("123.4567");System.out.println(bd.multiply(bd)); // 15241.55677489`

`​BigDecimal​`​用​`​scale()​`​表示小数位数，例如：

`BigDecimal d1 = new BigDecimal("123.45");BigDecimal d2 = new BigDecimal("123.4500");BigDecimal d3 = new BigDecimal("1234500");System.out.println(d1.scale()); // 2,两位小数System.out.println(d2.scale()); // 4System.out.println(d3.scale()); // 0`

`BigDecimal d1 = new BigDecimal("123.4500");BigDecimal d2 = d1.stripTrailingZeros();System.out.println(d1.scale()); // 4System.out.println(d2.scale()); // 2,因为去掉了00BigDecimal d3 = new BigDecimal("1234500");BigDecimal d4 = d3.stripTrailingZeros();System.out.println(d3.scale()); // 0System.out.println(d4.scale()); // -2`

`import java.math.BigDecimal;import java.math.RoundingMode;`

Run

`BigDecimal d1 = new BigDecimal("123.456");BigDecimal d2 = new BigDecimal("23.456789");BigDecimal d3 = d1.divide(d2, 10, RoundingMode.HALF_UP); // 保留10位小数并四舍五入BigDecimal d4 = d1.divide(d2); // 报错：ArithmeticException，因为除不尽`

`import java.math.BigDecimal;`

Run

`BigDecimal n = new BigDecimal("12.75");BigDecimal m = new BigDecimal("0.15");BigDecimal[] dr = n.divideAndRemainder(m);if (dr[1].signum() == 0) {    // n是m的整数倍}`

### 比较BigDecimal

`BigDecimal d1 = new BigDecimal("123.456");BigDecimal d2 = new BigDecimal("123.45600");System.out.println(d1.equals(d2)); // false,因为scale不同System.out.println(d1.equals(d2.stripTrailingZeros())); // true,因为d2去除尾部0后scale变为2System.out.println(d1.compareTo(d2)); // 0`

总是使用compareTo()比较两个BigDecimal的值，不要使用equals()！

`public class BigDecimal extends Number implements Comparable<BigDecimal> {    private final BigInteger intVal;    private final int scale;}`

`​BigDecimal​`​也是从​`​Number​`​继承的，也是不可变对象。

### 小结

`​BigDecimal​`​用于表示精确的小数，常用于财务计算；