Subversion Repositories Integrator Subversion

Rev

Rev 767 | Go to most recent revision | Details | Last modification | View Log | RSS feed

Rev Author Line No. Line
762 blopes 1
package br.com.sl.domain.util;
2
 
3
import java.math.BigDecimal;
4
import java.math.RoundingMode;
5
 
6
public final class BigDecimalUtils {
7
 
8
    private static final BigDecimal ZERO = BigDecimal.ZERO;
9
 
10
    /**
11
     * Valor sentinela para representar NaN em BigDecimal.
12
     * (Você pode ajustar para outro número se quiser)
13
     */
14
    public static final BigDecimal BD_NAN = new BigDecimal("-999999999");
15
 
16
    private BigDecimalUtils() {}
17
 
18
    /* ============================================================
19
       CONVERSÕES SEGURAS
20
       ============================================================ */
21
 
22
    /**
23
     * Converte double em BigDecimal de forma segura.
24
     */
25
    public static BigDecimal converterDoubleEmBigDecimal(Double value) {
26
        return BigDecimal.valueOf(value);
27
    }
28
 
29
    /**
30
     * Converte String em BigDecimal de forma segura.
31
     * Aceita vírgula ou ponto.
32
     */
33
    public static BigDecimal converterStringEmBigDecimal(String value) {
34
        if (value == null || value.trim().isEmpty()) {
35
            return ZERO;
36
        }
37
        value = value.trim().replace(",", ".");
38
        return new BigDecimal(value);
39
    }
40
 
41
    /**
42
     * Normaliza null → ZERO
43
     */
44
    public static BigDecimal n(BigDecimal value) {
45
        return value == null ? ZERO : value;
46
    }
47
 
48
    /* ============================================================
49
       OPERAÇÕES MATEMÁTICAS
50
       ============================================================ */
51
 
52
    public static BigDecimal soma(BigDecimal a, BigDecimal b) {
53
        return n(a).add(n(b));
54
    }
55
 
56
    public static BigDecimal subtracao(BigDecimal a, BigDecimal b) {
57
        return n(a).subtract(n(b));
58
    }
59
 
60
    public static BigDecimal multiplicacao(BigDecimal a, BigDecimal b) {
61
        return n(a).multiply(n(b));
62
    }
63
 
64
    public static BigDecimal divisao(BigDecimal a, BigDecimal b) {
65
        if (b == null || b.compareTo(BigDecimal.ZERO) == 0) {
66
            throw new ArithmeticException("Divisão por zero");
67
        }
68
        return n(a).divide(n(b), 10, RoundingMode.HALF_UP);
69
    }
70
 
71
    /* ============================================================
72
       COMPARAÇÕES
73
       ============================================================ */
74
 
75
    public static boolean ehMaiorQue(BigDecimal a, BigDecimal b) { // a > b
76
        return n(a).compareTo(n(b)) > 0;
77
    }
78
 
79
    public static boolean ehMenorQue(BigDecimal a, BigDecimal b) { // a < b
80
        return n(a).compareTo(n(b)) < 0;
81
    }
82
 
83
    public static boolean ehMaiorOuIgualQue(BigDecimal a, BigDecimal b) { // a >= b
84
        return n(a).compareTo(n(b)) >= 0;
85
    }
86
 
87
    public static boolean ehMenorOuIgualQue(BigDecimal a, BigDecimal b) { // a <= b
88
        return n(a).compareTo(n(b)) <= 0;
89
    }
90
 
91
    public static boolean ehIgual(BigDecimal a, BigDecimal b) { // a == b
92
        return n(a).compareTo(n(b)) == 0;
93
    }
94
 
95
    public static boolean ehDiferente(BigDecimal a, BigDecimal b) { // a != b
96
        return n(a).compareTo(n(b)) != 0;
97
    }
98
 
99
    /* ============================================================
100
       EXTENSÕES
101
       ============================================================ */
102
 
103
    /**
104
     * Valor absoluto.
105
     */
106
    public static BigDecimal retornarValorAbsoluto(BigDecimal a) {
107
        return n(a).abs();
108
    }
109
 
110
    /**
111
     * Arredonda com casas decimais.
112
     */
113
    public static BigDecimal arredondar(BigDecimal a, int casasDecimais) {
114
        return n(a).setScale(casasDecimais, RoundingMode.HALF_UP);
115
    }
116
 
117
    /**
118
     * Verifica se 'a' está entre min e max, inclusive.
119
     */
120
    public static boolean estaEntre(BigDecimal valor, BigDecimal minimo, BigDecimal maximo) {
121
        BigDecimal val = n(valor);
122
        return val.compareTo(n(minimo)) >= 0 && val.compareTo(n(maximo)) <= 0;
123
    }
124
 
125
    /* ============================================================
126
       MÉTODOS ESPECIALIZADOS PARA O ROBÔ
127
       ============================================================ */
128
 
129
    /**
130
     * Diferença absoluta (amplitude).
131
     */
132
    public static BigDecimal amplitude(BigDecimal abertura, BigDecimal fechamento) {
133
        return retornarValorAbsoluto(subtracao(fechamento, abertura));
134
    }
135
 
136
    /**
137
     * Retorna true se valor for maior que zero.
138
     */
139
    public static boolean positivo(BigDecimal a) {
140
        return ehMaiorQue(a, ZERO);
141
    }
142
 
143
    /**
144
     * Retorna true se valor for menor que zero.
145
     */
146
    public static boolean negativo(BigDecimal a) {
147
        return ehMenorQue(a, ZERO);
148
    }
149
 
150
    /**
151
     * Retorna o maior dos dois valores (equivalente ao Math.max).
152
     */
153
    public static BigDecimal maximo(BigDecimal a, BigDecimal b) {
154
        BigDecimal na = n(a);
155
        BigDecimal nb = n(b);
156
        return na.compareTo(nb) >= 0 ? na : nb;
157
    }
158
 
159
    /**
160
     * Retorna o menor dos dois valores (equivalente ao Math.min).
161
     */
162
    public static BigDecimal minimo(BigDecimal a, BigDecimal b) {
163
        BigDecimal na = n(a);
164
        BigDecimal nb = n(b);
165
        return na.compareTo(nb) <= 0 ? na : nb;
166
    }
167
 
168
         /* ============================================================
169
            SUPORTE A NaN / INFINITY
170
            ============================================================ */
171
 
172
         /**
173
          * Converte double em BigDecimal de forma segura
174
          * evitando NaN, -Infinity e +Infinity.
175
          */
176
         public static BigDecimal fromDouble(double value) {
177
             if (Double.isNaN(value) || Double.isInfinite(value)) {
178
                 return BD_NAN; // Valor sentinela
179
             }
180
             return BigDecimal.valueOf(value);
181
         }
182
 
183
         /**
184
          * Verifica se um BigDecimal representa um NaN lógico.
185
          */
186
         public static boolean isNaN(BigDecimal v) {
187
             return v != null && v.compareTo(BD_NAN) == 0;
188
         }
189
 
190
}