不可变类
8种基本类型的包装类型以及BigInteger、BigDecimal
BigInteger
Java中,CPU原生提供的最大整形范围是64位long,64位long能够直接通过CPU指令运行,计算速度快;但是数据范围超过64位long呢?
针对这种情况,Java提供了一个类来模拟大整数 --- BigInteger,它能够表示任意大小的整数,缺点是计算速度慢;做运算时只能用该类提供的计算方法做运算;
BigDecimal
和BigInteger类似,BigDecimal用来表示任意大小的浮点数并且精度完全准确
1、浮点数乘法
BigDecimal bd = new BigDecimal("123.45670000");
System.out.println(bd.multiply(bd));
15241.5567748900000000
2、获取有效值完全一致,但是去除末尾的0
BigDecimal bd = new BigDecimal("123.45670000");
System.out.println(bd.multiply(bd).stripTrailingZeros());
15241.55677489
3、获取小数位数
BigDecimal bd = new BigDecimal("123.45670000");
System.out.println(bd.multiply(bd).scale());
16
4、设置小数有效位数并设置取舍规则
BigDecimal bd3 = new BigDecimal("123.456789");
BigDecimal bd4 = bd3.setScale(4, RoundingMode.HALF_UP);
System.out.println(bd4);
BigDecimal bd5 = bd3.setScale(4, RoundingMode.DOWN);
System.out.println(bd5);
BigDecimal bd6 = bd3.setScale(4, RoundingMode.UP);
System.out.println(bd6);
BigDecimal bd8 = bd3.setScale(4, RoundingMode.CEILING);
123.4568
123.4567
123.4568
123.4568
5、BigDecimal做加减乘时,精度不会丢失,但是除法时,存在除不尽的情况,可以使用如下方法计算商和余数,divideAndRemainder返回一个数组
BigDecimal n = new BigDecimal("12.75");
BigDecimal m = new BigDecimal("0.14");
BigDecimal[] dr = n.divideAndRemainder(m);
System.out.println(dr[0]);
System.out.println(dr[1]);
91
0.01