BigDecimal、DecimalFormat工具类-浮点类型计算格式化-史上最全=_=

继上一篇屌的一批的时间操作工具类之后又一力作BigDecimal浮点类型操作/DecimalFormat浮点类型格式化保留小数

注意:强制依赖jdk8以上

方法:支持可变长参数,所有数值类型以及collection类型

声明:可变长参数的方法跟传入两个参数的方法其实是可以用重载来声明相同的方法名的。这里个人认为在使用工具类的时候其实大概知道自己传入参数的数量,所以用更鲜明的方法名来区分会更易阅读,在自身知道传入的是两个参数的时候建议不要调用可变长参数,这样的性能会更优。

/*
 * Copyright 2016-2018. Individual ownership panw
 *
 * Tech blog at http://blog.csdn.net/hatsune_miku_.
 *
 * Contact Mailbox at mikuismywifu@gmail.com.
 *
 * panwang All Rights Reserved.
 */
package com.miku.common.utils.numeric;

import java.math.BigDecimal;
import java.text.DecimalFormat;
import java.util.Arrays;
import java.util.Collection;

/**
 * File Name:BigDecimalUtils
 *
 * @author:panwang
 * @description: 浮点类型计算工具类
 * @date:2017/11/24
 * @version:V1.0
 * @see:jdk8 Copyright (c) 2017, mikuismywifu@gmail.com All Rights Reserved.
 */
public class BigDecimalUtils {

    private static final String DECIMAL_DEFAULT="0.00";

    private static final DecimalFormat DECIMALFORMAT_DEFAULT = new DecimalFormat("0.00");

    /**
     * 将数值转换为BigDecimal
     *
     * @param o object
     * @return
     */
    public static BigDecimal objectToBigDecimal (Object o) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o)));
    }

    /**
     * 将两个数值相加并返回浮点类型
     *
     * @param o1 object
     * @param o2 object
     * @return bigDecimal
     */
    public static BigDecimal plus (Object o1, Object o2) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .add(BigDecimal.valueOf(Double.valueOf(String.valueOf(o2))));
    }

    /**
     * 将传入的数值累加返回,入参必须是数字,任意类型
     *
     * @param o objects
     * @return bigDecimal
     */
    public static BigDecimal objectsTotalToBD (Object... o) {
        return Arrays.stream(o)
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::add).get();
    }

    /**
     * 将集合的所有数值做累计操作,collection元素任意类型
     *
     * @param t extends collection
     * @param <T> object
     * @return
     */
    public static <T extends Collection<?>> BigDecimal arrTotalToBD (T t) {
        return t.stream()
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::add).get();
    }

    /**
     * 参数一减去参数二返回浮点类型
     *
     * @param o1 object
     * @param o2 object
     * @return
     */
    public static BigDecimal subtract (Object o1, Object o2) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .subtract(BigDecimal.valueOf(Double.valueOf(String.valueOf(o2))));
    }

    /**
     * 将参数一减去后续所有数值,任意类型
     *
     * @param total object
     * @param o objects
     * @return
     */
    public static BigDecimal subtractObjectsToBD (Object total, Object... o) {
        return Arrays.stream(o)
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal.valueOf(Double.valueOf(String.valueOf(total))),(a,b) -> a.subtract(b));
    }

    /**
     * 将参数一减去后续集合中所有数值,collection元素任意类型
     *
     * @param total object
     * @param t extends collection
     * @param <T> object
     * @return
     */
    public static <T extends Collection<?>> BigDecimal subtractArrToBD (Object total, T t) {
        return t.stream()
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal.valueOf(Double.valueOf(String.valueOf(total))),(a,b) -> a.subtract(b));
    }

    /**
     * 计算两个数值的乘积
     *
     * @param o1 object
     * @param o2 object
     * @return
     */
    public static BigDecimal multiply (Object o1, Object o2) {
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .multiply(BigDecimal.valueOf(Double.valueOf(String.valueOf(o2))));
    }

    /**
     * 计算多个数值的乘积,任意类型长度
     *
     * @param o objects
     * @return
     */
    public static BigDecimal multiplyObjectsToBD (Object... o) {
        return Arrays.stream(o)
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::multiply).get();
    }

    /**
     * 计算集合中数值的乘积,collection元素任意类型
     *
     * @param t extends collection
     * @param <T> object
     * @return
     */
    public static <T extends Collection<?>> BigDecimal multiplyArrToBD (T t) {
        return t.stream()
                .map(v -> BigDecimal.valueOf(Double.valueOf(String.valueOf(v))))
                .reduce(BigDecimal::multiply).get();
    }

    /**
     * 两个数相除四舍五入
     * 根据指定保留小数,如果不指定则默认保留两位
     *
     * @param o1 object
     * @param o2 object
     * @return
     */
    public static BigDecimal divide(Object o1, Object o2,Integer i) {
        if (i == null) {
            i = 2;
        }
        return BigDecimal.valueOf(Double.valueOf(String.valueOf(o1)))
                .divide(BigDecimal.valueOf(
                        Double.valueOf(String.valueOf(o2))),i,BigDecimal.ROUND_HALF_UP);
    }

    /**
     * 格式化浮点类型成指定的小数四舍五入,缺省格式0.00
     * 设置格式请看DecimalFormat
     *
     * @param o object
     * @param format string
     * @return strng
     * @see java.text.DecimalFormat
     */
    public static String objectFormatToString(Object o,String format) {
        if (format == null) {
            format = DECIMAL_DEFAULT;
        }
        DecimalFormat decimalFormat = new DecimalFormat(format);
        return decimalFormat.format(
                BigDecimal.valueOf(Double.valueOf(String.valueOf(o))));
    }

    /**
     * 格式化浮点类型成指定的小数四舍五入,缺省格式0.00
     * 设置格式请看DecimalFormat
     *
     * @param o object
     * @param format string
     * @return bigDecimal
     * @see java.text.DecimalFormat
     */
    public static BigDecimal objectFormatToBD(Object o,String format) {
        if (format == null) {
            format = DECIMAL_DEFAULT;
        }
        DecimalFormat decimalFormat = new DecimalFormat(format);
        return BigDecimalUtils.objectToBigDecimal(
                decimalFormat.format(
                BigDecimal.valueOf(Double.valueOf(String.valueOf(o)))));
    }
}

结语:如有觉得不够力,不够用的请留言注明!!
博客原创:写作不易,转载请标明出处。文章地址:文章地址(๑˃∀˂๑)♪阿里嘎多(๑˃∀˂๑)♪

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值