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
integer no banco de
dados para armazenar o valor.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
Continue lendo
Error Handling inspirado em Go: Mudando o jogo no JavaScript
Como uma nova proposta ECMAScript pode acabar com os problemas do try-catch e trazer mais controle ao seu...
Por que lidar com Datas em JavaScript é insanidade
Um mergulho honesto na bagunça dos objetos Date, comportamento maluco do JavaScript e tudo que você precisa saber...
Como criar um slider com JavaScript na prática
Construa um componente de slider funcional usando HTML, CSS e JavaScript desde o zero. Ideal para quem quer praticar...
JavaScript: Acabou Sofrimento com Datas
Temporal API mata 90% dos bugs de data. Você nunca mais vai sofrer com timezone.