/** * 時間範圍佔比 * * @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(); } }