概述
1.java.math.BigDecimal类提供了算术,缩放操作,舍入,比较,散列和格式转换的操作
加减乘除
BigDecimal bignum1 = new BigDecimal("10");
BigDecimal bignum2 = new BigDecimal("5");
BigDecimal bignum3 = null;
//加法
bignum3 = bignum1.add(bignum2);
System.out.println("求和:" + bignum3);
//减法
bignum3 = bignum1.subtract(bignum2);
System.out.println("求差:" + bignum3);
//乘法
bignum3 = bignum1.multiply(bignum2);
System.out.println("乘法积:" + bignum3);
//除法
bignum3 = bignum1.divide(bignum2);// 不推荐这样写
System.out.println("除法结果:" + bignum3);
// 在进行除法计算时,需要商是无线循环小数时,会抛出异常java.lang.ArithmeticException:
// Non-terminating decimal expansion; no exact representable decimal result,需要设置小数点后的余位
bignum3 = bignum1.divide(bignum2,2,BigDecimal.ROUND_UP );
四舍五入
//ROUND_UP:非0时,舍弃小数后(整数部分)加1,比如12.49结果为13,-12.49结果为 -13
//ROUND_DOWN:直接舍弃小数(截取行为),比如12.49结果为12,-12.49结果为 -12
//ROUND_CEILING:如果 BigDecimal 是正的,则做 ROUND_UP 操作;如果为负,则做 ROUND_DOWN 操作 (一句话:取附近较大的整数)
//ROUND_FLOOR: 如果 BigDecimal 是正的,则做 ROUND_DOWN 操作;如果为负,则做 ROUND_UP 操作(一句话:取附近较小的整数)
//ROUND_HALF_UP:四舍五入(取更近的整数)比如:1.5->2
//ROUND_HALF_DOWN:五舍六入。跟ROUND_HALF_UP 差别仅在于0.5时会向下取整 比如:1.5->1
//ROUND_HALF_EVEN:银行家舍入法(四舍六入五取偶)->被修约的数字等于5时,要看5前面的数字,若是奇数则进位,若是偶数则将5舍掉,即修约后末尾数字都成为偶数;若5的后面还有不为“0”的任何数,则此时无论5的前面是奇数还是偶数,均应进位。
//ROUND_UNNECESSARY:不需要取整,如果存在小数位,就抛ArithmeticException 异常
BigDecimal bg1 = new BigDecimal(16.543242123);
// 参数1:保留的小数位数 参数2:roundingMode的类型
bg1 = bg1.setScale(1, BigDecimal.ROUND_HALF_EVEN);
System.out.println(bg1.toString()); //16.5
BigDecimal bg2 = new BigDecimal(3.35);
bg2 = bg2.setScale(1, BigDecimal.ROUND_HALF_EVEN);
System.out.println(bg2.toString()); //3.4
BigDecimal bg3 = new BigDecimal(6.3456);
bg3 = bg3.setScale(1, BigDecimal.ROUND_HALF_EVEN);
System.out.println(bg3.toString()); //6.3