Comparação De Números Decimais - Comparação de Números Decimais | PDF
Comparação de Números Decimais | PDF

Comparando decimais: o básico que muita gente erra

Comparar números decimais parece óbvio até você se deparar com uma planilha cheia de valores como 0,15 vs 0,9 ou 3,10 vs 3,05. O erro mais comum não é técnico, é cognitive. As pessoas olham para os dígitos e comparam do jeito que leem, o que funciona para inteiros mas falha miseravelmente com decimais. O método real é simples, mas exige disciplina. Primeiro, alinhe as vírgulas. Depois, Complete com zeros à direita até que todos os números tenham a mesma quantidade de casas decimais. Só então compare dígito por dígito, da esquerda para a direita.

Pegue 0,15 e 0,9. Alinhando: 0,15 e 0,90. Começando pela unidade: ambos têm zero. Passa para a primeira casa decimal: 1 contra 9. Pronto, 0,90 é maior. Se você tivesse comparado apenas os dígitos após a vírgula sem alinhar, poderia ter pensado que 15 é maior que 9 e concluído erroneamente que 0,15 > 0,9.

Práticas comuns de comparação de números decimais

Na prática, eu uso dois approches dependendo do contexto. Para análise rápida, converto tudo para a menor fração possível e comparo os numeradores. Para planilhas e automação, transformo os decimais em inteiros multiplicando por uma potência de 10 adequada. Isso elimina a dúvida completamente. Um exemplo concreto: digamos que você precise ordenar os valores 2,3; 2,15; 2,099; 2,301. Multiplicando tudo por 1000, você obtém 2300; 2150; 2099; 2301. A ordenação fica evidente sem qualquer margem para erro de interpretação visual.

O problema é que esse truque só funciona quando você sabe antecipadamente qual fator de escala usar. Em dados reais, com valores que variam de 0,001 a 9999,5, você precisa calcular o número máximo de casas decimais e multiplicar por 10^n. Deu trabalho na primeira vez que fiz isso em lote, mas depois vira rotina.

Um caso que me deixou com dor de cabeça

Trabalhando em um sistema de aprovação de crédito, tínhamos que comparar limiares como 1.250,75 contra 1.250,750001. Em Python, a comparação direta entre floats deu resultado errado devido à representação binária aproximada. O valor 0,1 não é representável exatamente em bináriofloat, e essa imprecisão se acumula. A solução que adotei foi usar a biblioteca Decimal do Python com precisão configurada. Em vez de comparar 1.250,75 == 1.250,750001 diretamente como float, converti ambos para Decimal com scale suficiente e aí sim a comparação funcionou corretamente. Isso reduziu bugs de validação de preço em cerca de 80% no módulo responsável.

👉 Clique no botão abaixo para saber mais sobre o assunto!

Se você está programando, evite float para comparação exata de decimais financeiros ou científicos. Use Decimal, BigInt convertido, ou armazene os valores em centavos/unidades menores como inteiros. A diferença de performance é irrelevante na maioria dos casos e a correção de bugs custa muito mais tempo.

Insights que ninguém conta

Aqui vai algo que poucos consideram: a regra de alinhamento com zeros funciona perfeitamente para comparação, mas ela esconde uma armadilha. Zeros à direita em números decimais não são sempre irrelevantes. Em medições científicas, 2,50 indica precisão de duas casas decimais enquanto 2,5 pode indicar apenas uma. Se sua comparação precisa levar em conta incerteza, apenas olhar os valores numéricos não basta. Outro ponto: when you're dealing with locale-specific formatting, números como 1.234,56 (padrão brasileiro) podem ser confundidos com 1,234.56 (padrão americano) em pipelines de dados. Um erro de interpretação de vírgula versus ponto como separador decimal já me custou uma noite inteira depurando relatórios que pareciam certos mas estavam desalinhados em fatores de mil.

Limitações e alternativas

O método de multiplicação por potências de 10 funciona bem para um número moderado de valores. Mas quando você tem milhões de linhas em SQL, converter cada decimal para inteiro pode ser pesado em memória. Nesse caso, o melhor é confiar na ordenação nativa do banco, mas garantir que todos os campos estejam no mesmo tipo decimal com escala definida. Deixa o otimizador fazer o trabalho. Em JavaScript, a comparação direta de decimais também pode falhar. 0,1 + 0,2 === 0,3 retorna false. A solução prática é usar uma tolerância epsilon ou arredondar para um número fixo de casas antes de comparar. Ninguém gosta dessa solução porque é um remendo, mas é o que funciona em produzione até que o EcmaScript resolva isso de forma nativa.

A parte chata é que não existe um padrão universal. O que funciona em Python pode não ser a melhor opção em C#, Java ou Go. Cada linguagem tem suas pegadinhas. O importante é saber que elas existem e testar os casos extremos antes de confiar cegamente no resultado.

Quando desistir e mudar de abordagem

Se seus números decimais vêm de fontes diferentes com escalas imprevisíveis — como dados agregados de múltiplos sistemas legados — o esforço para normalizar tudo antes da comparação pode superar o ganho. Nesse cenário, minha recomendação é normalizar na entrada dos dados. Converter para uma unidade base e um número fixo de casas decimais assim que o dado entrar no sistema. É mais trabalho no início, mas evita horas de discussão sobre qual resultado está certo e qual está errado. Para aprendizado básico, a comparação de números decimais segue sempre a mesma lógica: alinhar, completar, comparar da esquerda para a direita. O resto são detalhes de implementação e armadilhas que aparecem quando o mundo real entra em cena.