Como calcular e validar o dígito verificador do NIT colombiano, com código

O algoritmo módulo 11 com pesos primos que o NIT colombiano usa, um exemplo calculado à mão e funções em Python e JavaScript testadas com casos reais, mais o que a validação não pode dizer.

Neste artigo
Em 30 segundos

O dígito verificador do NIT calcula-se multiplicando cada dígito, da direita para a esquerda, por uma série de primos (3, 7, 13…), somando e tomando o resto módulo 11; serve para detectar erros de digitação, não para saber se o contribuinte existe.

1. O que é o dígito verificador#

Um NIT colombiano escreve-se como 890.903.938-8: o último número, depois do hífen, é o dígito verificador (DV). Calcula-se a partir dos outros dígitos com um método de módulo 11 e serve para detectar erros de digitação ao capturar o número em um formulário, uma fatura ou um banco de dados.

Validar o DV é uma verificação matemática. Um NIT com o DV correto pode não pertencer a nenhum contribuinte, e um inexistente pode passar na validação. Para confirmar que um contribuinte existe é preciso consultar o RUT ou os serviços da DIAN.

Documentação: Siempre al Día: dígito de verificação do NIT (espanhol) ↗

2. O algoritmo passo a passo#

As fontes consultadas coincidem nos passos: pegar os dígitos do NIT sem o DV, da direita para a esquerda; multiplicar cada um pelo seu peso da série de primos 3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67 e 71; somar os produtos e calcular o resto da divisão por 11. Se o resto é 0 ou 1, esse é o DV; se é maior, o DV é 11 menos o resto.

Dígito (da direita para a esquerda)PesoProduto
8324
3721
913117
31751
0190
923207
0290
937333
841328
Soma—1.081

Com o NIT 890903938 (cujo DV publicado na fonte é 8), os produtos somam 1.081. Como 1.081 dividido por 11 deixa resto 3, o DV é 11 − 3 = 8.

Uma das guias consultadas aplica os pesos da esquerda para a direita; o cálculo que reproduz o exemplo publicado é o da direita para a esquerda, que é o que o código deste guia usa.

Documentação: Lookuptax: guia do NIT da Colômbia ↗ · Actualícese: calculadora do dígito de verificação (espanhol) ↗

3. Código em Python e JavaScript#

As duas funções aceitam o NIT com pontos ou hifens, ignoram qualquer caractere que não seja um dígito e rejeitam números de mais de 15 dígitos, o comprimento da série de pesos. Os casos de teste são NIT de exemplo e o seu DV calculado com o mesmo método.

python
PESOS = (3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71)

def digito_verificador(nit: str) -> int:
    """Dígito verificador (módulo 11) de um NIT sem o dígito final."""
    digitos = [c for c in nit if c.isdigit()]
    if not digitos or len(digitos) > len(PESOS):
        raise ValueError("o NIT deve ter entre 1 e 15 dígitos")
    soma = sum(int(d) * p for d, p in zip(reversed(digitos), PESOS))
    resto = soma % 11
    return resto if resto < 2 else 11 - resto

def e_valido(nit_completo: str) -> bool:
    """Valida um NIT com o seu dígito final: '890.903.938-8' ou '8909039388'."""
    somente = [c for c in nit_completo if c.isdigit()]
    return len(somente) >= 2 and digito_verificador("".join(somente[:-1])) == int(somente[-1])

for nit, dv in [("890903938", 8), ("800197268", 4), ("899999068", 1), ("900123456", 8)]:
    print(nit, digito_verificador(nit), digito_verificador(nit) == dv)
print(e_valido("890.903.938-8"), e_valido("890.903.938-7"))
Python 3, sem dependências. Imprime quatro verificações em True e depois True/False para o NIT bem e mal digitado.
javascript
const PESOS = [3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71];

function digitoVerificador(nit) {
  const digitos = [...String(nit)].filter(c => c >= "0" && c <= "9").reverse();
  if (digitos.length === 0 || digitos.length > PESOS.length) throw new Error("o NIT deve ter entre 1 e 15 dígitos");
  const soma = digitos.reduce((acc, d, i) => acc + Number(d) * PESOS[i], 0);
  const resto = soma % 11;
  return resto < 2 ? resto : 11 - resto;
}

function eValido(nitCompleto) {
  const somente = [...String(nitCompleto)].filter(c => c >= "0" && c <= "9");
  return somente.length >= 2 && digitoVerificador(somente.slice(0, -1).join("")) === Number(somente.at(-1));
}

console.log(digitoVerificador("890903938"), eValido("890.903.938-8"), eValido("890.903.938-7"));
JavaScript (Node.js). Imprime 8 true false.

Documentação: Python: str.isdigit ↗ · MDN: Array.prototype.reduce ↗

4. O que a validação não diz#

O DV só prova que os dígitos são coerentes entre si. Três coisas ficam de fora:

  • Existência: um NIT com DV correto pode não estar inscrito no RUT.
  • Identidade: não diz a quem pertence nem se está ativo.
  • Tipo de documento: a cédula de uma pessoa física valida-se com o mesmo método quando usada como NIT, mas um número que não seja NIT pode coincidir por acaso.

Valide o DV no formulário para pedir ao usuário que corrija um erro de digitação, e confirme na fonte oficial quando o dado tiver consequências, como uma nota fiscal eletrônica.

5. Boas práticas ao implementar#

  • Guarde o NIT e o DV separados, e calcule o DV ao exibir para detectar dados corrompidos.
  • Normalize antes de comparar: remova pontos, espaços e hifens para achar duplicados.
  • Escreva testes com NIT conhecidos, incluindo os que dão resto 0 e 1, porque é aí que quebram as implementações com erro na regra.
  • Não use esta validação como controle de segurança nem como prova de identidade.

Para se aprofundarPostgreSQL: encontre o índice certo com EXPLAIN

6. Mantenha seus números em dia#

Os pesos e a regra de módulo 11 são estáveis, mas a norma da DIAN sobre o NIT e o RUT muda. As fontes deste guia são guias contábeis e tributários consultados em 18 de outubro de 2026; confirme com a DIAN antes de usar a validação em processos regulados.

  • Revise a fonte oficial ao integrar com nota fiscal eletrônica.
  • Inclua testes com restos 0 e 1 na sua suíte.
  • Se guardar identificadores fiscais de outros países, não aplique esta regra a eles.

Fontes e escopo

Documentação consultada em 18 de outubro de 2026. Os exemplos e critérios de decisão são propostas editoriais; adapte-os ao contrato da sua aplicação e valide-os no seu ambiente de testes autorizado.

Compare estas opções

Compare bancos de dados

Confira preços, limites, condições e fontes de cada opção.

Abrir comparador
Consultoria

Seu caso é diferente?

Conte seu contexto e as opções que você está avaliando. Respondemos com critérios e fontes, sem assinaturas automáticas.

Pedir consultoria