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) | Peso | Produto |
|---|---|---|
| 8 | 3 | 24 |
| 3 | 7 | 21 |
| 9 | 13 | 117 |
| 3 | 17 | 51 |
| 0 | 19 | 0 |
| 9 | 23 | 207 |
| 0 | 29 | 0 |
| 9 | 37 | 333 |
| 8 | 41 | 328 |
| 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.
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"))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"));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.