在涉及到金额或精度要求教高的情况下是适合使用 Bigdecimal 的,本文规整一下相关操作方法
BigDecimal a = new BigDecimal(10);
BigDecimal b = new BigDecimal(15);
BigDecimal add = a.add(b);
System.out.println("a+b="+add);
BigDecimal subtract = b.subtract(a);
System.out.println("b-a="+subtract);
BigDecimal multiply = b.multiply(a);
System.out.println("b*a="+multiply);
BigDecimal divide = b.divide(a);
System.out.println("b/a="+divide);
小数取值取多少位多用与除法,因为只有除法才有几率增大小数位数,加减乘只会保留当前小数位数或减少
BigDecimal c = new BigDecimal(113);
BigDecimal d = new BigDecimal(7);
BigDecimal divide = c.divide(d, 2, BigDecimal.ROUND_UP);
System.out.println("除法保留两位小数"+divide);
divide的第三个参数为设置保留小数位数,更多参数如下:
ROUND_UP:正数时,舍弃小数后(整数部分)加1,比如12.49结果为13。负数时,舍弃小数后(整数部分)减去1,-12.49结果为 -13
ROUND_DOWN:直接舍弃小数
ROUND_CEILING:如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作 (取附近较大的整数)
ROUND_FLOOR: 如果 BigDecimal 是正的,则做 ROUND_DOWN 操作;如果为负,则做 ROUND_UP 操作(取附近较小的整数)
ROUND_HALF_UP:四舍五入(取更近的整数)
ROUND_HALF_DOWN:同ROUND_HALF_UP 差别仅在于0.5时会向下取整
ROUND_HALF_EVEN:取最近的偶数
ROUND_UNNECESSARY:不需要取整,如果存在小数位,就抛ArithmeticException 异常
加减乘的结果也可以设置小数位数,获取结果后使用setScale方法
BigDecimal a = new BigDecimal(12.4);
BigDecimal b = new BigDecimal(32.8);
BigDecimal multiply = a.multiply(b).setScale(2,BigDecimal.ROUND_HALF_UP);
使用compareTo方法,返回int 结果
int i = a.compareTo(b)
i = -1,表示a小于b;
i = 0,表示a等于b;
i = 1,表示a大于b;
BigDecimal amt = new BigDecimal(121);
BigDecimal[] results = amt.divideAndRemainder(BigDecimal.valueOf(3));
System.out.println("商为:"+results[0]);
System.out.println("余数为:"+results[1]);
BigDecimal a = new BigDecimal("0.9");
System.out.println("向下取整:" + a.setScale(0,BigDecimal.ROUND_FLOOR));
BigDecimal b = new BigDecimal("0.1");
System.out.println("向上取整:" + b.setScale(0,BigDecimal.ROUND_UP));
BigDecimal b = new BigDecimal(20.5);
if (new BigDecimal(b.intValue()).compareTo(b) != 0) {
System.out.println("b 是小数");
} else {
System.out.println("b 是整数");
}
Bigdecimal没有+=的方式,只有使用加法达到累加的结果
BigDecimal a = new BigDecimal(20.5);
BigDecimal b = new BigDecimal(20.5);
BigDecimal b ...
a=a.add(b);
a=a.add(c);
...
如果你是累加list等集合里面的结果,可以使用Java8以后的Stream
BigDecimal decimal = list.stream().reduce(BigDecimal.ZERO, BigDecimal::add);
System.out.println(decimal);
BigDecimal result = list.stream()
// 将Employee对象的salary取出来 map返回为Bigdecimal
.map(Employee::getSalary)
// 使用reduce()聚合函数,实现累加器
.reduce(BigDecimal.ZERO,BigDecimal::add);
System.out.println(result);