Java BigDecimal 保留小数工具、BigDecimal常用的方法

BigDecimal 保留两位(自己设置)小数工具


/**
 * @Author huicai
 * @Date 2024/8/9 09:27
 **/
public class BigDecimalUtil {
	//保留几位
    static int two = 2;

    /**
     * BigDecimal 保留两位小数
     *
     * @param number
     * @return
     */
    public static BigDecimal keepTwoDecimalPlaces(BigDecimal b) {
        return ObjectUtils.isEmpty(b) ? BigDecimal.ZERO : b.setScale(two, RoundingMode.HALF_UP);
    }


    /**
     * 计算列表中指定字段(Bigdecimal)的值总和并保留两位小数
     *
     * @param list
     * @param func
     * @param <T>
     * @return
     */
    public static <T> BigDecimal calBdList(List<T> list, Function<? super T, BigDecimal> func) {
        return CollectionUtils.isEmpty(list) ? BigDecimal.ZERO : list.stream().map(func).filter(Objects::nonNull).reduce(BigDecimal::add).orElse(BigDecimal.ZERO).setScale(two, RoundingMode.HALF_UP);
    }

    /**
     * 一个对象
     * BigDecimal 保留两位小数
     *
     * @param t
     * @param names 不保留成两位小数的字段
     * @param <T>
     * @return
     */
    public static <T> T keepTwoDecimalPlaces(T t, String... names) {
        //获取里面的字段
        Field[] fields = t.getClass().getDeclaredFields();
        try {
            for (Field field : fields) {
             	//判断是不是 BigDecimal 类型 && 是不是需要保留两位小数的字段
                if (BigDecimal.class.equals(field.getType()) && !Arrays.toString(names.clone()).contains(field.getName())) {
                    //设置字段可访问
                    field.setAccessible(true);
                    // 覆盖原来的值
                    field.set(t, keepTwoDecimalPlaces((BigDecimal) field.get(t)));
                }
            }
        } catch (IllegalAccessException e) {
            e.printStackTrace();
        }
        return t;
    }

    /**
     * 一个集合里面的对象
     * BigDecimal 保留两位小数
     * 保留两位小数
     *
     * @param list
     * @param names 不保留成两位小数的字段
     * @param <T>
     * @return
     */
    public static <T> List<T> keepTwoDecimalPlaces(List<T> list, String... names) {
        for (T t : list) {
            keepTwoDecimalPlaces(t, names);
        }
        return list;
    }
}

BigDecimal 保留两位小数工具测试


        //单个(BigDecimal)保留两位小数
        BigDecimal bigDecimal = new BigDecimal("1.234567");
        System.out.println(BigDecimalUtil.keepTwoDecimalPlaces(bigDecimal));
        //输出 1.23

        //准备数据
        Order order = new Order();
        order.setOrderaount(new BigDecimal("100.234567"));
        order.setDiscountAmount(new BigDecimal("11.134"));

        //对象属性(BigDecimal)保留两位小数
        System.out.println(BigDecimalUtil.keepTwoDecimalPlaces(order));
        //输出 Order(orderaount=100.23, discountAmount=11.13)

        //准备数据
        Order order2 = new Order();
        order2.setOrderaount(new BigDecimal("1011.12567"));
        order2.setDiscountAmount(new BigDecimal("111.122"));
        Order order3 = new Order();
        order3.setOrderaount(new BigDecimal("100.234567"));
        order3.setDiscountAmount(new BigDecimal("11.134"));
        List<Order> list = new ArrayList<>();
        list.add(order2);
        list.add(order3);


        //List<对象>属性(BigDecimal)保留两位小数
        System.out.println(BigDecimalUtil.keepTwoDecimalPlaces(list));
        //输出 [Order(orderaount=100.23, discountAmount=11.13), Order(orderaount=1011.13, discountAmount=111.12)]


        //准备数据
        Order order4 = new Order();
        order4.setOrderaount(new BigDecimal("1011.12567"));
        order4.setDiscountAmount(new BigDecimal("111.122"));
        Order order5 = new Order();
        order5.setOrderaount(new BigDecimal("100.234567"));
        order5.setDiscountAmount(new BigDecimal("11.134"));
        List<Order> list3 = new ArrayList<>();
        list3.add(order4);
        list3.add(order4);


        //List<对象>属性(BigDecimal)保留两位小数 排除指定字段
        System.out.println(BigDecimalUtil.keepTwoDecimalPlaces(list3, "orderaount"));
        //输出 [Order(orderaount=100.234567, discountAmount=11.13), Order(orderaount=1011.12567, discountAmount=111.12)]




BigDecimal 常用的方法

//new BigDecimal()方法初始化一个浮点型数据时,需要显示设置Scale(精度)否则运算时可能会有精度问题(这个和BigDecimal 默认精度有关),String就没问题;如果是整数则默认精度为0
        BigDecimal b1 = new BigDecimal("3.1415926");
        System.out.println(b1);
        //输出:3.1415926
        BigDecimal b2 = new BigDecimal(3.1415926);
        System.out.println(b2);
        //输出:3.14159260000000006840537025709636509418487548828125

        //加法 add(BigDecimal)
        BigDecimal b3 = new BigDecimal("1.1");
        BigDecimal b4 = new BigDecimal("1.1");
        System.out.println(b3.add(b4));
        //输出:2.2

        //减法 subtract(BigDecimal)
        BigDecimal b5 = new BigDecimal("4.4");
        BigDecimal b6 = new BigDecimal("1.1");
        System.out.println(b5.subtract(b6));
        //输出:3.3

        //乘法 multiply(BigDecimal)
        BigDecimal b7 = new BigDecimal("5");
        BigDecimal b8 = new BigDecimal("8");
        System.out.println(b7.multiply(b8));
        //输出:40

        //除法 divide(BigDecimal)
        BigDecimal b9 = new BigDecimal("100");
        BigDecimal b10 = new BigDecimal("4");
        System.out.println(b9.divide(b10));
        //输出:25

        BigDecimal b11 = new BigDecimal("110");
        BigDecimal b12 = new BigDecimal("3");
        // 保留️四位小数  向上取整
        System.out.println(b11.divide(b12, 4, BigDecimal.ROUND_HALF_UP));
        //输出:36.6667

        //绝对值 abs(),返回一个BigDecimal类型的绝对值
        BigDecimal b13 = new BigDecimal("-13");
        System.out.println(b13.abs());
        //输出:13

        //相反数 negate(),返回一个BigDecimal类型的相反数
        BigDecimal b14 = new BigDecimal("-10");
        System.out.println(b14.negate());
        //输出:10

        //精度 scale()precision(),scale()返回的是小数点右边的位数,precision()返回的是小数点左右两边相加的位数
        BigDecimal b15 = new BigDecimal("10.123456789");
        System.out.println(b15.scale());
        //输出:9
        System.out.println(b15.precision());
        //输出:11


        //比较大小 compareTo(BigDecimal)
        BigDecimal b16 = new BigDecimal("101");
        BigDecimal b17 = new BigDecimal("100");
        // b17 比 b16大多少
        System.out.println(b17.compareTo(b16));
        //输出:-1
        // b16 比 b17大多少
        System.out.println(b16.compareTo(b17));
        //输出:1


        //比较大小 并返回大的 max(BigDecimal)
        BigDecimal max = b17.max(b16);
        System.out.println(max);
        //输出:101

        //比较大小 并返回小的 min(BigDecimal)
        BigDecimal min = b17.min(b16);
        System.out.println(min);
        //输出:100
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值