🚀 Oferta especial: 60% OFF no CrazyStack - Últimas vagas!Garantir vaga →
JavaScript

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.

CrazyStack
12 min de leitura
floatdecimaljavascriptbackendbanco de dadosbugcentavosinteirorelatórios financeiros

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

1
Passo 1: Sempre converta o valor decimal para centavos multiplicando por 100 antes de salvar.
2
Passo 2: Utilize um campo integer no banco de dados para armazenar o valor.
3
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

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

Big.js

Biblioteca para precisão matemática com decimais em JavaScript

Saiba mais →

Dinero.js

Lib para manipulação de valores monetários com controle de casas decimais

Saiba mais →

Decimal.js

Opera floats sem perda de precisão

Saiba mais →

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.

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?

Domine React e Node com o CrazyStack

Aprenda técnicas avançadas de React com nosso curso completo