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.
Carregando
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.
Como uma nova proposta ECMAScript pode acabar com os problemas do try-catch e trazer mais controle ao seu...
Um mergulho honesto na bagunça dos objetos Date, comportamento maluco do JavaScript e tudo que você precisa saber...
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.
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.
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.
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.
Floats seguem o padrão IEEE 754, que não representa todos os decimais exatos, resultando em pequenas diferenças no valor calculado.
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.
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.
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.
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.
Evite salvar números monetários como float no banco de dados quando utiliza esses valores para somar, subtrair ou gerar relatórios.
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.
integer no banco de
dados para armazenar o valor.Armazena valores decimais diretamente. Exemplo: 8.00
Armazena todos os valores em centavos. Exemplo: 800 = 8 reais
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.
Adote inteiros para valores que possam ser somados, subtraídos ou utilizados em qualquer processamento matemático. Simples assim.
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.
Documente suas decisões e faça testes automatizados incluindo operações com múltiplos decimais. Prevenir custa muito menos que corrigir!
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.