Em sistemas financeiros, precisão é uma exigência legal, contábil e auditável. Os tipos primitivos como double e float utilizam representação binária, o que gera erros de precisão. Então o padrão para se trabalhar com valores monetários é o BigDecimal, pois ele traz: precisão decimal exata, controle explícito de escala e controle explícito de arredondamento.
O padrão para lidar com valores é:
- Uso de BigDecimal
- Escala fixa de 4 casas decimais (mesmo que só exiba duas usa 4 nos cálculos)
- Arredondamento HALF_EVEN (arredondamento bancário)
- Usar numeric no Banco de Dados (Numeric(19,4))
Porém para se trabalhar corretamente com BigDecimal é preciso obedecer algumas regras:
- Nunca iniciar o construtor a partir de um double ou float:
new BigDecimal(10.25); // errado, faz o valor entrar nos erros de cálculo de repres. binária
- Existem duas formas para inicializar:
new BigDecimal("10.25"); // A partir de String
BigDecimal.valueOf(10.25); // Usando valueOf
// criando valores corretamente
BigDecimal valor = new BigDecimal("123.456789")
.setScale(4, RoundingMode.HALF_EVEN);
- O arredondamento é o RoundingMode.HALF_EVEN
Exemplo:
Nenhum comentário:
Postar um comentário