BigDecimal 方法使用
1 创建
/** * 1 创建 */ //new 对象 BigDecimal a = new BigDecimal("3"); // 内部静态 BigDecimal b = BigDecimal.valueOf(23L); BigDecimal c = BigDecimal.ONE; BigDecimal d = BigDecimal.TEN; BigDecimal e = BigDecimal.ZERO;
2 加减乘除
/** * 1 创建 */ //new 对象 BigDecimal a = new BigDecimal("3"); // 内部静态 BigDecimal b = BigDecimal.valueOf(23L); BigDecimal c = BigDecimal.ONE; BigDecimal d = BigDecimal.TEN; BigDecimal e = BigDecimal.ZERO; /** * 2 加减乘除 精度(除不尽情况报异常) 一般配合 scale方法+舎入方法 */ //加法 去2位小数 BigDecimal add = b.add(a).setScale(2, BigDecimal.ROUND_HALF_UP); // 减法 取1位小数 BigDecimal subtract = b.subtract(a).setScale(1, BigDecimal.ROUND_HALF_DOWN); // 乘法 取3位小数 BigDecimal multiplyA = b.multiply(a).setScale(3, BigDecimal.ROUND_FLOOR); // 除法 取两位小数 divideA 写法是错误的 先➗ 除不尽就已经报异常了 //BigDecimal divideA = b.divide(a).setScale(2, BigDecimal.ROUND_HALF_UP); BigDecimal divideB = b.divide(a, 2, BigDecimal.ROUND_HALF_UP);
3 舎入模式
3.1 ROUND_UP 向上取整
3.2 ROUND_DOWN 向下取整
3.3 ROUND_HALF_UP 四舍五入
3.4ROUND_HALF_DOWN 五舍六入
3.5 ROUND_FLOOR 负无穷
3.6 ROUND_CEILING 正无穷
3.7 ROUND_HALF_EVEN 银行家舎入法
3.8 ROUND_UNNECESSARY 不需要舎入
4 组合使用
这里灵活多变,自己运用得当。
5 方法
5.1 相等
equals :比较精度
compareTo:不比较精度 (一般用这个)
5.2 max 最大值
5.3 min 最小值
5.4 pow 幂
5.5 round
5.6 abs 绝对值
5.7 小数点移动
5.8 negate 取反
5.9 plus
round 调用的就是plus
5.10 ulp
6 转换
摘:测试代码
public static void main(String[] args) {
/**
* 1 创建
*/
//new 对象
BigDecimal a = new BigDecimal("3");
// 内部静态
BigDecimal b = BigDecimal.valueOf(23L);
BigDecimal c = BigDecimal.ONE;
BigDecimal d = BigDecimal.TEN;
BigDecimal e = BigDecimal.ZERO;
/**
* 2 加减乘除 精度(除不尽情况报异常) 一般配合 scale方法+舎入方法
*/
//加法 去2位小数
BigDecimal add = b.add(a).setScale(2, BigDecimal.ROUND_HALF_UP);
// 减法 取1位小数
BigDecimal subtract = b.subtract(a).setScale(1, BigDecimal.ROUND_HALF_DOWN);
// 乘法 取3位小数
BigDecimal multiplyA = b.multiply(a).setScale(3, BigDecimal.ROUND_FLOOR);
// 除法 取两位小数 divideA 写法是错误的 先➗ 除不尽就已经报异常了
//BigDecimal divideA = b.divide(a).setScale(2, BigDecimal.ROUND_HALF_UP);
BigDecimal divideB = b.divide(a, 2, BigDecimal.ROUND_HALF_UP);
/**
* RoundingMode 舍入模式 8种 小数取舍测试
*/
BigDecimal f = BigDecimal.valueOf(10);
BigDecimal g = BigDecimal.valueOf(3);
//小数位向上取整 3.333 -> 3.34
BigDecimal divide1 = f.divide(g, 2, BigDecimal.ROUND_UP);
//小数向下取整 3.333 -> 3.33
BigDecimal divide2 = f.divide(g, 2, BigDecimal.ROUND_DOWN);
//小数 四舍五入 3.333 -> 3.33
BigDecimal divide3 = f.divide(g, 2, BigDecimal.ROUND_HALF_UP);
/**
* 小数 五舍六入
* 0.5 ->0 divide4=0
* 0.555 ->0.5 divide5=0.5
*/
BigDecimal k = BigDecimal.valueOf(0.5);
BigDecimal m = BigDecimal.valueOf(0.555);
BigDecimal l = BigDecimal.valueOf(1);
BigDecimal divide4 = k.divide(l, 0, BigDecimal.ROUND_HALF_DOWN);
BigDecimal divide5 = m.divide(l, 2, BigDecimal.ROUND_HALF_DOWN);
BigDecimal n = BigDecimal.valueOf(0.555);
BigDecimal o = BigDecimal.valueOf(1);
BigDecimal j = BigDecimal.valueOf(-0.555);
/**
* 正数 数字部分-向下取整 ROUND_UP 0.555 -> 0.55 divide6=0.55
* 负数 数字部分-向上取整 ROUND_DOWN -0.555 -> -0.56 divide7=-0.56
* 不管怎么取 最后的数往小的取 负无穷模式
*/
BigDecimal divide6 = n.divide(o, 2, BigDecimal.ROUND_FLOOR);
BigDecimal divide7 = j.divide(o, 2, BigDecimal.ROUND_FLOOR);
/**
*正数 数字部分-向上取整 ROUND_UP 0.555 -> 0.56 divide6=0.56
*负数 数字部分-向下取整 ROUND_DOWN -0.555 -> -0.55 divide7=-0.55
* 不管怎么取 最后的数往大的取 正无穷模式
*/
BigDecimal divide8 = n.divide(o, 2, BigDecimal.ROUND_CEILING);
BigDecimal divide9 = j.divide(o, 2, BigDecimal.ROUND_CEILING);
/**
* 银行家舎入法
* 这里取两位小数
* *小数第二位是奇数 四舍五入 ROUND_HALF_UP (四舍) 0.554 -> 0.55 divide11 =0.55
*小数第二位是奇数 四舍五入 ROUND_HALF_UP (五入) 0.555 -> 0.56 divide10 =0.56
*
* 小数第二位是偶数 五舍六入 ROUND_HALF_DOWN (五舍) 0.565 -> 0.56 divide12 =0.56
* 小数第二位是偶数 五舍六入 ROUND_HALF_DOWN (六入)0.566 -> 0.57 divide13 =0.57
*/
BigDecimal x = BigDecimal.valueOf(0.555);
BigDecimal r = BigDecimal.valueOf(0.554);
BigDecimal z = BigDecimal.valueOf(0.565);
BigDecimal s = BigDecimal.valueOf(0.566);
BigDecimal y = BigDecimal.valueOf(1);
BigDecimal divide10 = x.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
BigDecimal divide11 = r.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
BigDecimal divide12 = z.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
BigDecimal divide13 = s.divide(y, 2, BigDecimal.ROUND_HALF_EVEN);
/**
*精确值 不需要舎入 有精度会报错 divide14 会报错
*/
//BigDecimal divide14 = s.divide(y, 2, BigDecimal.ROUND_UNNECESSARY);
BigDecimal divide14 = s.divide(y,BigDecimal.ROUND_UNNECESSARY);
/**
* 组合使用
* 例如:(a*b)/(10-c) + d
*/
BigDecimal add1 = a.multiply(b).divide(BigDecimal.TEN.subtract(c), 2, BigDecimal.ROUND_UP).add(d);
/**
* 转换string bigA
* toPlainString:0.0000000007755443848456408430750165156389829002048230677246465347707271575927734375
* toString: 7.755443848456408430750165156389829002048230677246465347707271575927734375E-10
* toString() 科学计数法
*/
BigDecimal bigA = new BigDecimal(Math.pow(0.5671, 25));
BigDecimal bigB = new BigDecimal(Math.pow(0.5671, 25));
BigDecimal bigD = new BigDecimal(2);
/**
* 比较
* equals :比较精度
* compareTo:不比较精度 (一般用这个)
* 至于为什么两个equals 会有不同的值 已经提示了
*/
BigDecimal bigC = new BigDecimal(1.2);
BigDecimal bigE = new BigDecimal(1.20000000);
boolean equals = bigE.equals(bigC);
//true
System.out.println(bigE.equals(bigC));
System.out.println(bigE.compareTo(bigC));
BigDecimal z1 = new BigDecimal("0");
BigDecimal z2 = new BigDecimal("0.0");
//false
System.out.println(z1.equals(z2));
System.out.println(z1.compareTo(z2));
//两数 取最大
BigDecimal max = bigD.max(bigC);
//两数 取最小
BigDecimal min = bigD.min(bigC);
//n次幂 4
BigDecimal pow = bigD.pow(2);
// 四舍五入 2.345 -> 2.3 round=2.3
BigDecimal bigF = new BigDecimal(2.345);
MathContext math = new MathContext(2);
BigDecimal round = bigF.round(math);
//绝对值 -23 -> 23
BigDecimal bigG = new BigDecimal("-23");
BigDecimal abs = bigG.abs();
/**
* movePointLeft 小数点左移
* movePointRight 小数点右移
*/
BigDecimal bigH = new BigDecimal("23.4567");
BigDecimal bigDecimal = bigH.movePointLeft(1);
BigDecimal bigDecimal1 = bigH.movePointRight(1);
/**
* 取反 23.4567 -> -23.4567
*/
BigDecimal negate = bigH.negate();
/**
* 跟round 一样 底层都是plus
*/
MathContext math1 = new MathContext(3);
BigDecimal plus = bigH.plus(math1);
System.out.println(plus);
/**
* ulp
* 返回最后一位的位置 都是1
* 231212 -> 1
* 2.31212 -> 0.00001
*/
BigDecimal bigK = new BigDecimal("231212");
BigDecimal bigO = new BigDecimal("2.31212");
BigDecimal ulp = bigO.ulp();
System.out.println(ulp);
/**
* 6 转换
*/
BigDecimal bigP = new BigDecimal("2312");
bigP.doubleValue();
bigP.longValue();
bigP.intValue();
bigP.byteValue();
bigP.shortValue();
bigP.byteValue();
/**
* toString 数字过长 会采用 科学计数法
* toPlainString 这个正常显示
*/
bigP.toString();
bigP.toPlainString();
}