Por que somar 0.7 + 0.1 dá errado
O erro clássico dos floats em JavaScript, por que isso é um problema em aplicações reais e como evitar bugs usando inteiros e centavos.
Por que isso é importante
Por que somar 0.7 + 0.1 dá errado. O erro clássico dos floats em JavaScript, por que isso é um problema em aplicações reais e como evitar bugs usando inteiros e centavos.
O estranho resultado de 0.7 + 0.1 em JavaScript
Abra o console agora. Digite 0.7 + 0.1. O resultado? 0.7999999999999999. Não é bug do JavaScript,
é como computadores lidam com decimais. E sim, isso quebra sistemas reais se você não souber lidar.
Atenção
Fazer operações com floats em código pode gerar resultados imprecisos. Esse detalhe
quase invisível pode explodir em sistemas sensíveis, principalmente quando envolve
dinheiro.
Como o JavaScript armazena números decimais?
JavaScript usa floats para todos os números decimais. Economiza memória, mas perde precisão. Quanto mais
casas decimais, pior fica. Não é defeito, é tradeoff: velocidade e espaço em troca de exatidão.
Info técnica
Floats seguem o padrão IEEE 754, que não representa todos os decimais exatos,
resultando em pequenas diferenças no valor calculado.
Por que 0.7 + 0.1 resulta em 0.7999999999999999?
O problema é binário vs decimal. Alguns números decimais não têm representação exata em binário, igual
1/3 não tem representação exata em decimal (0.333...). O computador arredonda, e os "restos" aparecem:
0.7999999999999999.
Cuidado ao exibir resultados
Você pode não perceber esse erro logo de cara, já que a maioria das interfaces
arredondam o valor. No entanto, ao somar muitos desses valores imprecisos, o erro se
acumula, gerando grandes divergências.
Quando esses erros se tornam perigosos?
Sistema financeiro com floats é desastre anunciado. Pequenos erros se acumulam. Saldos não batem.
Relatórios ficam inconsistentes. Cliente reclama que falta 1 centavo. Acontece mais do que você imagina.
Vale a pena salvar valores como ponto flutuante?
Float só serve se você nunca vai calcular nada. Só exibir ou guardar histórico? Beleza. Mas vai somar,
subtrair, gerar relatório? Não use float. Simples assim.
Atenção: Risco de bug em cálculos
Evite salvar números monetários como float no banco de dados quando utiliza esses
valores para somar, subtrair ou gerar relatórios.
Como evitar erros ao salvar valores financeiros?
Solução? Inteiros. Salve tudo em centavos. R$ 8,00 vira 800 centavos. R$ 15,47 vira 1547. Zero
imprecisão, zero erro acumulado. É assim que sistemas sérios lidam com dinheiro.
Passo a passo para armazenar valores em centavos
- Passo 1: Sempre converta o valor decimal para centavos
multiplicando por 100 antes de salvar. - Passo 2: Utilize um campo
integerno banco de
dados para armazenar o valor. - Passo 3: Para exibir para o usuário, divida por 100 (ou use uma
função de formatação).
Comparando métodos: Float x Inteiro (Centavos)
Ponto Flutuante (Float)
Armazena valores decimais diretamente. Exemplo: 8.00
+ Prós
- • Mais simples em alguns contextos
- • Útil para exibição sem cálculos
− Contras
- • Pode gerar bugs em cálculos
- • Erros acumulados em relatórios
- • Incompatível com necessidades financeiras
Inteiro (Centavos)
Armazena todos os valores em centavos. Exemplo: 800 = 8 reais
+ Prós
- • Zero risco de quebra de precisão
- • Ideal para cálculos financeiros
- • Evita bugs acumulativos
− Contras
- • Requer conversão na exibição
- • Mais atenção ao manipular para mostrar décimais
Recomendações práticas para desenvolvedores
Regra de ouro: dinheiro sempre em centavos (inteiros). Float só se você jurar que nunca vai calcular.
Documente isso, padronize no time, não deixe cada um fazer do seu jeito.
Resumo prático
Adote inteiros para valores que possam ser somados, subtraídos ou utilizados em
qualquer processamento matemático. Simples assim.
Dicas de ferramentas para trabalhar com precisão numérica
Conclusão: nunca subestime casas decimais
Ignorar isso no começo vira pesadelo depois. Bugs acumulam, saldos divergem, correção vira refatoração
gigante. Proteja seu sistema desde o início: dinheiro = inteiro. Não tem desculpa.
Dica Final
Documente suas decisões e faça testes automatizados incluindo operações com múltiplos
decimais. Prevenir custa muito menos que corrigir!
Transforme sua carreira
E foi EXATAMENTE por isso que eu criei um curso de Node.js e React chamado CrazyStack.
A minha maior necessidade no início da carreira era alguém que me ensinasse um projeto
prático onde eu pudesse não só desenvolver minhas habilidades de dev como também
lançar algo pronto para entrar no ar no dia seguinte.
Sabe qual era minha maior frustração? Aplicar conhecimentos teóricos em projetos
práticos e reais, mas não encontrar ninguém que me ensinasse COMO fazer isso na
prática! Era exatamente a mesma frustração que você deve sentir: acumular informação
sem saber como implementar na prática.
Assim como você precisa de estratégias claras e implementação prática para ter
sucesso, todo desenvolvedor precisa de um projeto estruturado para sair do teórico e
partir para a execução. É como ter todas as peças do quebra-cabeça mas não saber como
montá-las - você pode ter conhecimento técnico, mas sem um projeto completo, fica
difícil transformar esse conhecimento em resultados concretos.
No CrazyStack, você constrói um SaaS completo do zero - backend robusto em Node.js,
frontend moderno em React, autenticação, pagamentos, deploy, tudo funcionando. É o
projeto que eu queria ter quando comecei: algo que você termina e pode colocar no ar
no mesmo dia, começar a validar com usuários reais e até monetizar.
Checklist Rápido de Implementação
- Identificou todos os campos monetários armazenados como float?
- Transformou todos eles para inteiro (centavos) no banco de dados?
- Adequou o front-end para dividir por 100 na exibição?
- Testou cálculos em relatórios e exportações?
- Padronizou convenção para equipe?
Perguntas frequentes
Como o JavaScript armazena números decimais?
JavaScript usa floats para todos os números decimais. Economiza memória, mas perde precisão. Quanto mais casas decimais, pior fica. Não é defeito, é tradeoff: velocidade e espaço em troca de exatidão.
Por que 0.7 + 0.1 resulta em 0.7999999999999999?
O problema é binário vs decimal. Alguns números decimais não têm representação exata em binário, igual 1/3 não tem representação exata em decimal (0.333...). O computador arredonda, e os "restos" aparecem: 0.7999999999999999.
Quando esses erros se tornam perigosos?
Sistema financeiro com floats é desastre anunciado. Pequenos erros se acumulam. Saldos não batem. Relatórios ficam inconsistentes. Cliente reclama que falta 1 centavo. Acontece mais do que você imagina.
Vale a pena salvar valores como ponto flutuante?
Float só serve se você nunca vai calcular nada. Só exibir ou guardar histórico? Beleza. Mas vai somar, subtrair, gerar relatório? Não use float. Simples assim.
Como evitar erros ao salvar valores financeiros?
Solução? Inteiros. Salve tudo em centavos. R$ 8,00 vira 800 centavos. R$ 15,47 vira 1547. Zero imprecisão, zero erro acumulado. É assim que sistemas sérios lidam com dinheiro.