Escolar Documentos
Profissional Documentos
Cultura Documentos
double ao BigDecimal
Postado em 15. jul, 2010 por Paulo Silveira em Java
Compartilhar
É fácil se deparar com as limitações do double no Java e na maioria das outras linguagens:
quando vamos trabalhar com dinheiro notamos que as contas não estão saindo exatamente
como esperávamos:
double d1 = 0.1;
double d2 = 0.2;
System.out.println(d1 + d2);
Como obter o esperado 0.3? A sugestão sempre é usar o BigDecimal. BigDecimal é uma
classe que trabalha com números de ponto flutuante de precisão arbitrária: você pode
escolher quanto de precisão você quer usar. Por padrão ele vai utilizar o que for necessário,
e, diferente do double, ele consegue guardar números como 0.1, pois guardará isto como
sendo 1 x 10ˆ-1 (isto é, usando a base decimal em vez de binária, evitando a dízima).
// nao use esse construtor:
BigDecimal big1 = new BigDecimal(0.1);
BigDecimal big2 = new BigDecimal(0.2);
System.out.println(big1.add(big2));
Como resolver? Basta sempre usar o construtor que trabalha com Strings, assim o
BigDecimal vai internamente fazer o parsing desses números sem que eles sejam
armazenados em um double, evitando os problemas de precisão:
// atencao! usando String no construtor:
BigDecimal big1 = new BigDecimal("0.1");
BigDecimal big2 = new BigDecimal("0.2");
System.out.println(big1.add(big2));
System.out.println(big1.divide(big2, 3, RoundingMode.UP));
No JavaScript teremos o mesmo problema caso você precise realizar contas no lado do
cliente, e aí podemos usar a BigDecimalJS, que funciona de maneira análoga ao Java.
O Rafael Ferreira lembra que podemos ir além, e como dinheiro é algo pertencente ao
nosso domínio e lógica de negócios, criamos uma classe Money para encapsular todo esse
comportamento e evitar que RoundingMode, MathContext e escalas se espalhem por todo
seu código.