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 组合使用
这里灵活多变,自己运用得当。
摘:测试代码
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); System.out.println(add1); }