時間範圍佔比工具類

   /**
     * 時間範圍佔比
     *
     * @param st  開始時間戳
     * @param et  結束時間戳
     * @param cst 對比開始時間戳
     * @param cet 對比結束時間戳
     * @return 佔比
     * @author liushouyun
     */
    public static Tuple2<Integer, Double> proportionOfTimeRange(long st, long et, long cst, long cet) {
        double stMax = st;
        double enMin = et;
        boolean stFlag = false;
        boolean etFlag = false;
        if (st <= cst) {
            stFlag = true;
            stMax = cst;
        }
        if (et >= cet) {
            etFlag = true;
            enMin = cet;
        }
        Tuple2<Integer, Double> tuple2;
        if ((enMin - stMax) <= 0) {
            tuple2 = Tuples.of(0, 0.0);
        } else if (stFlag && etFlag) {
            tuple2 = Tuples.of(1, OperationUtil.div((enMin - stMax), (et - st)));
        } else {
            tuple2 = Tuples.of(2, OperationUtil.div((enMin - stMax), (cet - cst)));
        }
        return tuple2;
    }

 

package com.baidu.traffic.sc.common.util;

import java.math.BigDecimal;

/**
 * Created by liushouyun on 2019-08-12 15:55.
 */
public class OperationUtil {
    // 默認除法運算精度
    private static final int DEF_DIV_SCALE = 10;

    /**
     * 提供精確的加法運算。
     *
     * @param v1 被加數
     * @param v2 加數
     * @return 兩個參數的和
     * @author liushouyun
     */
    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 兩個參數的差
     * @author liushouyun
     */
    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 兩個參數的積
     * @author liushouyun
     */
    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 兩個參數的商
     * @author liushouyun
     */
    public static double div(double v1, double v2) {

        return div(v1, v2, DEF_DIV_SCALE);
    }

    /**
     * 提供(相對)精確的除法運算。當發生除不盡的狀況時,由scale參數指
     * 定精度,之後的數字四捨五入。
     *
     * @param v1    被除數
     * @param v2    除數
     * @param scale 表示表示須要精確到小數點之後幾位。
     * @return 兩個參數的商
     * @author liushouyun
     */
    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 四捨五入後的結果
     * @author liushouyun
     */
    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();
    }

}
相關文章
相關標籤/搜索