Como fazer cálculos com decimais sem errar
Eu trabalhava num sistema de precificação onde os valores vinham de um banco legado que salvava tudo como ponto flutuante. Um dia, percebi que uma conta simples de 0.1 + 0.2 estava retornando 0.30000000000000004. Parece bobo, mas isso causava desbalanço de caixa e o contador ficava ligado até 3h da manhã tentando entender o discrepancy. A solução que eu usei foi transformar tudo em inteiros de centavos antes de qualquer operação, e só converter de volta no final. Esse padrão evita uma série de problemas.
Operacoes com números decimais no dia a dia
O problema central é que o computador pensa em binário, não em decimal. Números como 0.1 e 0.2 não têm representação exata nessa base. O IEEE 754, que é o padrão que a maioria das linguagens segue, armazena aproximações. Isso significa que uma subtração pode te dar um número com muitos decimais estranhos, ou uma divisão que nunca fecha. Se você está programando, o primeiro passo é decidir se vai usar ponto flutuante mesmo ou se converte para inteiro. Em finanças, eu recomendo fortemente a segunda opção. Cada valor vira um número inteiro representando a menor unidade — centavos, milésimos, o que fizer sentido pro seu caso. Aí você faz toda a aritmética em inteiros. Só no momento de mostrar pro usuário é que você divide de volta.
Outra coisa que muita gente não considera: arredondamento. O Python tem o round(), mas ele segue o arredondamento bancário por padrão a partir da versão 3. Já em outras linguagens, o comportamento pode ser diferente. Eu perdi uma tarde inteira num projeto porque o Java arredondava 2.5 pra 2 e o Python pra 3, num contexto onde eu achava que eram iguais. Sempre deixe explícito qual regra de arredondamento você quer — ceil, floor, truncate, ou o meio impar. Quanto às operações básicas, a adição e subtração são mais seguras, desde que os números estejam na mesma escala. Multiplicação e divisão é onde os erros aparecem com mais frequência. Se você multiplicar 0.1 por 0.2, o resultado pode não ser exatamente 0.02. Por isso, em sistemas que precisam de precisão total, usa-se bibliotecas específicas. No Python, a Decimal do módulo decimal resolve isso, mas você precisa criar os números a partir de strings, não de floats. decimal.Decimal('0.1') * decimal.Decimal('0.2') funciona. decimal.Decimal(0.1) * decimal.Decimal(0.2) não funciona da forma esperada.
👉 Clique no botão abaixo para saber mais sobre o assunto!
Tem também o caso de precisão configurável. A biblioteca Decimal permite definir quantos algarismos significativos você quer, e como lidar com exceções de overflow ou underflow. Isso é útil quando você precisa replicar o comportamento de calculadoras científicas ou engines financeiras legadas.
Quando ponto flutuante ainda serve
Não é tudo ou nada. Em simulações científicas, gráficos, machine learning, o ponto flutuante é suficiente e muitas vezes necessário por performance. A questão é saber onde a precisão absoluta não é crítica. Se você está calculando a trajetória de uma partícula num jogo, um erro de 10^-15 não vai quebrar a experiência. Se você está calculando juros compostos de um empréstimo, aí sim esse erro se acumula. Uma dica prática: se você precisa comparar dois resultados decimais, nunca use igualdade direta. Use uma tolerância, um delta. math.isclose() no Python é bom pra isso, mas você precisa entender o que absolute e relative tolerance significam no seu contexto. Em dinheiro, tolerance zero quase sempre é o correto, porque cada centavo conta.
O que eu vejo muita gente errando também é na hora de formatar a saída. Colocar f-string com .2f parece seguro, mas se o valor já veio contaminado por um float, o arredondamento visual pode esconder um erro lógico que explode depois. Trate a precisão na raiz, não na embalagem. Se o seu projeto exige conversões entre moedas com taxas variáveis, considere usar uma library como moneyed ou pendulum, dependendo da linguagem. Elas escondem parte da complexidade, mas ainda assim exigem que você entenda o fundamento, senão você vai implementar algo que funciona nos testes mas falha em produção.