菜单 学习猿地 - LMONKEY

VIP

开通学习猿地VIP

尊享10项VIP特权 持续新增

知识通关挑战

打卡带练!告别无效练习

接私单赚外块

VIP优先接,累计金额超百万

学习猿地私房课免费学

大厂实战课仅对VIP开放

你的一对一导师

每月可免费咨询大牛30次

领取更多软件工程师实用特权

入驻
106
0

BigDecimalUtil:对double类型的数据进行处理(加减乘除、四舍五入、类型转换、比较两个值的大小)

原创
05/13 14:22
阅读数 8881

该工具类所在的包:import java.math.BigDecimal;

项目中使用该工具类的相关代码:

// 如果Output表中已经存在该节点(插入数据的节点)的信息,则修改Output表中的这条信息,其中完工数量就是获取的数据的完工数量加上已经存在的节点的完工数量,另外还要修改Input表中的数据
output.setId(outputList1.get(0).getId());
Double completeDty1 = Double.valueOf(StringUtils.isEmpty(productFeedERPDetailInfo.getCompleteQty()) ? "0" : productFeedERPDetailInfo.getCompleteQty());
Double completeDty2 = Double.valueOf(StringUtils.isEmpty(outputList1.get(0).getCompleteQty()) ? "0" : outputList1.get(0).getCompleteQty());
output.setCompleteQty(String.valueOf(BigDecimalUtil.add(completeDty1, completeDty2)));// 完工数量

工具类:

public class BigDecimalUtil {
    // 默认除法运算精度
    private static final int DEF_DIV_SCALE = 10;

    // 这个类不能实例化
    private BigDecimalUtil() {
    }

    /**
     * 提供精确的加法运算。
     *
     * @param v1
     *            被加数
     * @param v2
     *            加数
     * @return 两个参数的和
     */
    public static double add(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.add(b2).doubleValue();
    }

    /**
     * 提供精确的减法运算。
     *
     * @param v1
     *            被减数
     * @param v2
     *            减数
     * @return 两个参数的差
     */
    public static double sub(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.subtract(b2).doubleValue();
    }

    /**
     * 提供精确的乘法运算。
     *
     * @param v1
     *            被乘数
     * @param v2
     *            乘数
     * @return 两个参数的积
     */
    public static double mul(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.multiply(b2).doubleValue();
    }

    /**
     * 提供(相对)精确的除法运算,当发生除不尽的情况时,精确到 小数点以后10位,以后的数字四舍五入。
     *
     * @param v1
     *            被除数
     * @param v2
     *            除数
     * @return 两个参数的商
     */
    public static double div(double v1, double v2) {
        return div(v1, v2, DEF_DIV_SCALE);
    }

    /**
     * 提供(相对)精确的除法运算。当发生除不尽的情况时,由scale参数指 定精度,以后的数字四舍五入。
     *
     * @param v1
     *            被除数
     * @param v2
     *            除数
     * @param scale
     *            表示表示需要精确到小数点以后几位。
     * @return 两个参数的商
     */
    public static double div(double v1, double v2, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b1 = new BigDecimal(Double.toString(v1));
        BigDecimal b2 = new BigDecimal(Double.toString(v2));
        return b1.divide(b2, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的小数位四舍五入处理。
     *
     * @param v
     *            需要四舍五入的数字
     * @param scale
     *            小数点后保留几位
     * @return 四舍五入后的结果
     */
    public static double round(double v, int scale) {
        if (scale < 0) {
            throw new IllegalArgumentException(
                    "The scale must be a positive integer or zero");
        }
        BigDecimal b = new BigDecimal(Double.toString(v));
        BigDecimal one = new BigDecimal("1");
        return b.divide(one, scale, BigDecimal.ROUND_HALF_UP).doubleValue();
    }

    /**
     * 提供精确的类型转换(Float)
     *
     * @param v
     *            需要被转换的数字
     * @return 返回转换结果
     */
    public static float convertsToFloat(double v) {
        BigDecimal b = new BigDecimal(v);
        return b.floatValue();
    }

    /**
     * 提供精确的类型转换(Int)不进行四舍五入
     *
     * @param v
     *            需要被转换的数字
     * @return 返回转换结果
     */
    public static int convertsToInt(double v) {
        BigDecimal b = new BigDecimal(v);
        return b.intValue();
    }

    /**
     * 提供精确的类型转换(Long)
     *
     * @param v
     *            需要被转换的数字
     * @return 返回转换结果
     */
    public static long convertsToLong(double v) {
        BigDecimal b = new BigDecimal(v);
        return b.longValue();
    }

    /**
     * 返回两个数中大的一个值
     *
     * @param v1
     *            需要被对比的第一个数
     * @param v2
     *            需要被对比的第二个数
     * @return 返回两个数中大的一个值
     */
    public static double returnMax(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.max(b2).doubleValue();
    }

    /**
     * 返回两个数中小的一个值
     *
     * @param v1
     *            需要被对比的第一个数
     * @param v2
     *            需要被对比的第二个数
     * @return 返回两个数中小的一个值
     */
    public static double returnMin(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.min(b2).doubleValue();
    }

    /**
     * 精确对比两个数字
     *
     * @param v1
     *            需要被对比的第一个数
     * @param v2
     *            需要被对比的第二个数
     * @return 如果两个数一样则返回0,如果第一个数比第二个数大则返回1,反之返回-1
     */
    public static int compareTo(double v1, double v2) {
        BigDecimal b1 = new BigDecimal(v1);
        BigDecimal b2 = new BigDecimal(v2);
        return b1.compareTo(b2);
    }

    /**
     * 总数固定个数随机分配
     *
     * @param total
     *          总数
     * @param totalUser
     *          随机总个数
     * @return
     */
    public static BigDecimal[] randomAmount(BigDecimal total, int totalUser){
        BigDecimal perMax = total.divide(BigDecimal.valueOf(totalUser),4,BigDecimal.ROUND_HALF_DOWN).multiply(BigDecimal.valueOf(2));
        BigDecimal perMin = total.divide(BigDecimal.valueOf(totalUser),4,BigDecimal.ROUND_HALF_DOWN).divide(BigDecimal.valueOf(2),4, BigDecimal.ROUND_HALF_DOWN);
        int i = 0; //第几人
        BigDecimal[] array = new BigDecimal[totalUser];//分配结果集
        Random ran = new Random();
        BigDecimal yet = BigDecimal.ZERO; // 已分配的总金额

        //保证每个人有最小金额+随机值
        for (i = 0; i < totalUser; i++) {
            array[i] = perMin.add(BigDecimal.valueOf(ran.nextDouble()).multiply(BigDecimal.valueOf
                    (total.doubleValue()/totalUser - perMin.doubleValue())).setScale(4,BigDecimal.ROUND_HALF_DOWN));
            yet = yet.add(array[i]);
        }

        while (yet.compareTo(total) < 0){
            BigDecimal thisM =  BigDecimal.valueOf(ran.nextDouble()).multiply(BigDecimal.valueOf(perMax.doubleValue() -
                    perMin.doubleValue())).setScale(4,BigDecimal.ROUND_HALF_DOWN);
            i = ran.nextInt(totalUser); //随机选择人
            if (yet.doubleValue() + thisM.doubleValue() > total.doubleValue()){
                thisM = total.subtract(yet);
            }

            if (array[i].doubleValue() + thisM.doubleValue() < perMax.doubleValue())//判断是否超出最大金额
            {
                array[i] = array[i].add(thisM);
                yet = yet.add(thisM);
            }
        }

//        Array.Sort(array);
//        yet = BigDecimal.ZERO;
//        for (i = 0; i < totalUser; i++)
//        {
//            yet = yet.add(array[i]);
//            System.out.println("第{"+(i+1)+"}人=>分配{"+array[i]+"}元,合计分配{"+yet+"}元\r\n");
//        }
        return array;
    }
}

 

发表评论

0/200
106 点赞
0 评论
收藏
为你推荐 换一批