chen.lin
昨天 b003a49794f49a329e2702918ecfc8d14b371d0d
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
package com.vincent.rsf.server.common.utils;
 
import java.math.BigDecimal;
import java.math.RoundingMode;
 
/**
 * 数量运算工具:使用 BigDecimal 避免 Double 精度问题。
 * 实体仍为 Double 时,运算用本工具再转回 Double(保留 6 位小数)。
 */
public final class QuantityUtils {
 
    private static final int SCALE = 6;
    private static final RoundingMode ROUNDING = RoundingMode.HALF_UP;
 
    private QuantityUtils() {
    }
 
    private static BigDecimal toBigDecimal(Double v) {
        if (v == null) {
            return BigDecimal.ZERO;
        }
        return BigDecimal.valueOf(v);
    }
 
    /**
     * 加法:a + b,结果保留 6 位小数转 Double
     */
    public static Double add(Double a, Double b) {
        return toBigDecimal(a).add(toBigDecimal(b)).setScale(SCALE, ROUNDING).doubleValue();
    }
 
    /**
     * 减法:a - b,结果保留 6 位小数转 Double
     */
    public static Double subtract(Double a, Double b) {
        return toBigDecimal(a).subtract(toBigDecimal(b)).setScale(SCALE, ROUNDING).doubleValue();
    }
 
    /**
     * 比较:a 与 b 大小,避免直接用 Double 比较。
     * 返回 a.compareTo(b):负/0/正
     */
    public static int compare(Double a, Double b) {
        return toBigDecimal(a).compareTo(toBigDecimal(b));
    }
 
    /**
     * a > 0
     */
    public static boolean isPositive(Double a) {
        return compare(a, 0.0) > 0;
    }
 
    /**
     * a >= 0
     */
    public static boolean isNonNegative(Double a) {
        return compare(a, 0.0) >= 0;
    }
 
    /**
     * a <= 0
     */
    public static boolean isNonPositive(Double a) {
        return compare(a, 0.0) <= 0;
    }
 
    /**
     * 乘法:a * b,结果保留 6 位小数转 Double
     */
    public static Double multiply(Double a, Double b) {
        return toBigDecimal(a).multiply(toBigDecimal(b)).setScale(SCALE, ROUNDING).doubleValue();
    }
 
    /**
     * 除法:a / b,结果保留 6 位小数转 Double(b=0 时返回 0)
     */
    public static Double divide(Double a, Double b) {
        if (b == null || toBigDecimal(b).compareTo(BigDecimal.ZERO) == 0) {
            return 0.0;
        }
        return toBigDecimal(a).divide(toBigDecimal(b), SCALE, ROUNDING).doubleValue();
    }
 
    /**
     * 统一舍入到 6 位小数后转 Double(用于存库/展示、入参校验,避免浮点尾差)。
     * 所有 Double 写入实体或参与比较前建议经此方法或 add/subtract 做精度控制。
     */
    public static Double roundToScale(Double v) {
        if (v == null) {
            return 0.0;
        }
        return toBigDecimal(v).setScale(SCALE, ROUNDING).doubleValue();
    }
}