Por que 0.7 + 0.1 não é 0.8 em JavaScript? Veja tudo sobre float e centavos
Descubra 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
Erros com casas decimais podem causar grandes prejuízos nos sistemas, especialmente em aplicações financeiras. Saber como o JavaScript e outras linguagens lidam com números de ponto flutuante é fundamental para evitar cálculos incorretos e inconsistências em bancos de dados e relatórios.
O estranho resultado de 0.7 + 0.1 em JavaScript
Você já notou que ao somar 0.7 + 0.1 no JavaScript o resultado não é exatamente 0.8? Esse comportamento estranho assusta muitos desenvolvedores e pode gerar bugs difíceis de detectar.
⚠️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?
Por padrão, o JavaScript utiliza o tipo float (ponto flutuante) para representar números decimais. Esse modelo economiza espaço na memória, mas sacrifica a precisão em certas operações, principalmente quando envolve várias casas decimais.
ℹ️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 surge porque algumas frações decimais simplesmente não podem ser representadas exatamente na base binária. O resultado é uma soma com "restos" que aparecem como dígitos inesperados após a vírgula, como 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?
Quando seu sistema exige cálculos financeiros ou relatórios precisos, pequenas diferenças se tornam problemas sérios. Salvar e calcular valores decimais como float pode resultar em inconsistências de saldo, quebras em conferências e até prejuízo financeiro.
Vale a pena salvar valores como ponto flutuante?
Salvar valores como floats apenas faz sentido se você nunca realizará cálculos com eles na aplicação. Se a informação será utilizada somente para exibição ou registro histórico, os riscos são pequenos. Porém, se o valor irá para operações matemáticas, os riscos aumentam muito.
❌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?
A estratégia mais segura é salvar os valores em inteiros, representando centavos. Assim, elimina-se qualquer imprecisão causada pelo float. Por exemplo, em vez de salvar 8.00 reais, salve 800 (centavos).
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
Sempre que lidar com valores monetários, prefira armazenar em centavos. Só use floats se tiver absoluta certeza de que não haverá qualquer cálculo nesse campo. Documente decisões e padronize a abordagem em toda a equipe.
✅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 diferenças de precisão pode gerar danos imensos no longo prazo. Entenda os riscos e sempre proteja sua aplicação mudando a estratégia de armazenamento para inteiros quando for trabalhar com dinheiro.
ℹ️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.