Por que não usar double para Dinheiro
Problemas de precisão de ponto flutuante
Por que não usar double para Dinheiro é uma aula grátis de Java Academy no CoddyKit. Esta é a aula 1 de 4. Você pode ler a aula completa abaixo gratuitamente — depois pratica ao vivo no navegador com um editor de código integrado e um tutor de IA 24/7. Faz parte do caminho de aprendizado de Java Academy, e seu progresso é sincronizado entre a web e o app CoddyKit. O curso de Java Academy inclui 4 aulas no total.
Um padrão perigoso
Parece natural armazenar preços em um double. Infelizmente, double não consegue representar exatamente a maioria das frações decimais, o que gera pequenos erros que comprometem os cálculos financeiros.
A surpresa clássica
Some 0.1 e 0.2 com double e você não obterá 0.3. Obterá um valor com um pequeno erro de arredondamento.
public class Main {
public static void main(String[] args) {
double result = 0.1 + 0.2;
System.out.println(result);
}
}Por que isso acontece
Os computadores armazenam double em binário. Assim como um terço não pode ser escrito exatamente no sistema decimal, muitos números decimais, como 0.1, não podem ser escritos exatamente em binário.
A aproximação binária mais próxima é armazenada, e o erro se acumula.
Os erros se acumulam
Um único erro pequeno pode parecer inofensivo, mas, em um laço que percorre milhares de transações, as diferenças se acumulam e geram erros visíveis.
public class Main {
public static void main(String[] args) {
double total = 0.0;
for (int i = 0; i < 10; i++) {
total += 0.1;
}
System.out.println(total);
}
}Falha na igualdade
Por causa dos erros de arredondamento, comparar valores double calculados com == geralmente falha quando você espera que sejam iguais.
public class Main {
public static void main(String[] args) {
double a = 0.1 + 0.2;
double b = 0.3;
System.out.println(a == b);
}
}O dinheiro exige exatidão
Em finanças, um erro de uma fração de centavo é inaceitável. Os auditores esperam que os totais coincidam até o último centavo.
Por isso, o dinheiro nunca deve ser armazenado como um tipo de ponto flutuante.
A solução: BigDecimal
Java fornece BigDecimal, uma classe que armazena números decimais exatamente. Ela mantém o valor não escalado e a escala separadamente, portanto 0.1 realmente significa 0.1.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal a = new BigDecimal("0.1");
BigDecimal b = new BigDecimal("0.2");
System.out.println(a.add(b));
}
}Use sempre o construtor de texto
Crie um BigDecimal a partir de uma sequência de caracteres, não de um double. Passar um valor double leva o erro binário para dentro do BigDecimal.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal fromDouble = new BigDecimal(0.1);
BigDecimal fromString = new BigDecimal("0.1");
System.out.println(fromDouble);
System.out.println(fromString);
}
}Ou use valueOf
BigDecimal.valueOf é um atalho seguro. Ele converte o valor double usando sua forma textual canônica, evitando o erro binário bruto.
import java.math.BigDecimal;
public class Main {
public static void main(String[] args) {
BigDecimal price = BigDecimal.valueOf(19.99);
System.out.println(price);
}
}Armazenando dinheiro como centavos
Uma alternativa para casos simples é armazenar o dinheiro como uma quantidade inteira de centavos, usando long. Assim, 19,99 dólares se tornam 1999 centavos, e toda a matemática é feita exatamente com números inteiros.
public class Main {
public static void main(String[] args) {
long cents = 1999;
long total = cents * 3;
System.out.println(total + " cents");
}
}Conclusão principal
Use float e double em trabalhos científicos e gráficos, nos quais pequenos erros são aceitáveis. Para dinheiro e qualquer valor que precise ser exato, use BigDecimal ou uma quantidade inteira de centavos.
Verificação rápida
Teste sua compreensão da precisão de ponto flutuante.
Recapitulação
Você aprendeu por que a precisão dupla falha com dinheiro:
- A aritmética de ponto flutuante binário não consegue armazenar muitos números decimais exatamente
- Erros como
0.1 + 0.2não ser igual a 0.3 se acumulam - Use
BigDecimalpara aritmética decimal exata - Crie-o a partir de uma sequência de caracteres ou com
valueOf, nunca a partir de um double bruto - Armazenar centavos como números inteiros é outra opção exata
Perguntas Frequentes
A aula “Por que não usar double para Dinheiro” é grátis?
Sim — o texto completo de “Por que não usar double para Dinheiro” é grátis para ler aqui na web. Para praticá-la interativamente (um editor de código integrado e um tutor de IA 24/7) e desbloquear o restante do curso de Java Academy, atualize para CoddyKit PRO. O curso de Java Academy inclui 4 aulas no total.
O que vou aprender em “Por que não usar double para Dinheiro”?
Problemas de precisão de ponto flutuante Você pratica Java Academy com código prático que executa diretamente no navegador, e um tutor de IA 24/7 responde suas dúvidas enquanto trabalha na aula.
Preciso ter experiência prévia para começar Java Academy?
Nenhuma experiência prévia é necessária. Java Academy no CoddyKit é estruturado para alunos iniciantes até avançados, então você pode começar aqui ou desde o início e aprender no seu ritmo. Esta é a aula 1 de 4.
Quanto tempo leva a aula “Por que não usar double para Dinheiro”?
A maioria das aulas CoddyKit leva cerca de 5–10 minutos. Cada uma é compacta e interativa, então você faz progresso constante e retoma exatamente de onde parou entre web e app.
Posso escrever e executar código nesta aula de Java Academy?
Sim. Cada aula de Java Academy inclui um editor de código integrado, então você escreve e executa código real direto no navegador e recebe feedback de IA instantaneamente — nenhuma configuração local necessária.
Todas as aulas deste curso
- Por que não usar double para Dinheiro
- Trabalhando com BigDecimal
- Arredondamento e Escala
- BigInteger para Números Enormes