Como fazer subtração com números decimais sem errar
A maioria das pessoas trava porque acha que decimals são complicados. Eles não são. O erro acontece por preguiça, não por dificuldade. Vou explicar do jeito que funciona na prática. O processo básico é alinhamento de vírgulas. Você escreve um número embaixo do outro e garante que as vírgulas fiquem na mesma coluna vertical. Se um número tiver menos casas decimais, completa com zeros à direita. Nada mais.
Entendendo a lógica da subtracao com numeros decimais
Vamos ao exemplo real que usei na última semana. Um colega pediu ajuda com uma planilha onde uma coluna tinha valores como 127,45 e outra tinha 89,3. O resultado que aparecia no Excel estava estranho: 38,14999999999999. Isso acontece porque computadores representam decimais em binário e alguns números não têm representação exata. A conta certa é 38,15. O problema não é a subtração em si, é a representação interna dos floats. No papel, você alinha as vírgulas, completa com zero (89,3 vira 89,30), e faz a subtração coluna por coluna da direita para a esquerda. Se precisar de empréstimo, pega emprestado da coluna seguinte como faria com inteiros. 127,45 menos 89,30 dá 38,15. Pronto.
👉 Clique no botão abaixo para saber mais sobre o assunto!
O que os livros não ensinam é o caso em que o número de cima tem menos casas decimais. Por exemplo, 56,8 menos 23,457. Você completa o 56,8 com dois zeros à direita: vira 56,800. Aí subtrai normalmente. Resultados iguais a zero nas colunas mais à direita podem ser omitidos, mas manter os zeros durante o cálculo evita erros de alinhamento. Outro ponto que ninguém menciona: quando o resultado é negativo. Se você está fazendo 3,2 menos 8,7, o processo é o mesmo, só que o sinal do resultado será negativo. Você pode subtrair 8,7 menos 3,2 e colocar um sinal de menos na frente. Dá 5,5, então a resposta é -5,5.
Em contexto profissional, especialmente em finanças ou engenharia, eu nunca confio na subtração direta de floats. A workaround que uso é multiplicar tudo por uma potência de 10 que elimine as casas decimais, subtrair como inteiros, e depois dividir pelo mesmo fator. No exemplo anterior: 127,45 e 89,3. Multiplique por 100. Vira 12745 menos 8930. Resultado 3815. Divida por 100. 38,15. Exato. Zero ambiguidade binária. Isso corta o tempo de depuração de erro de arredondamento de cerca de 40 minutos para algo perto de zero, porque o problema simplesmente não existe mais. Claro, funciona só quando você sabe de antemão quantas casas decimais vai lidar. Se os dados forem dinâmicos e variáveis, aí o ideal é usar bibliotecas de precisão arbitrária ou tipos decimais fixos, como o Decimal do Python ou o BigDecimal do Java. Float padrão não serve pra isso.
Para cálculo mental rápido, uma alternativa válida é arredondar ambos os números para a casa decimal mais alta necessária, subtrair, e depois ajustar. Funciona bem quando você precisa de uma estimativa e não de exatidão. Por exemplo, 127,45 menos 89,3. Arredonda para 127 menos 89, que dá 38. Como os decimais são 0,45 menos 0,30 = 0,15, o resultado ajustado é 38,15. Aproximação que coincidiu porque os números eram próximos, mas em contas maiores o erro pode ser significativo. O único cenário em que o método de multiplicar por potência de 10 falha é quando você lida com números extremamente grandes com muitas casas decimais simultaneamente. Aí o inteiro resultante pode estourar o tipo padrão da linguagem. Nesses casos, volta-se para bibliotecas especializadas ou se divide o problema em partes menores.