Cómo calcular y validar el dígito de verificación del NIT en Colombia, con código

El algoritmo módulo 11 con pesos primos que usa el NIT colombiano, un ejemplo calculado a mano y funciones en Python y JavaScript probadas con casos reales, más lo que la validación no puede decirte.

En este artículo
En 30 segundos

El dígito de verificación del NIT se calcula multiplicando cada dígito, de derecha a izquierda, por una serie de primos (3, 7, 13…), sumando y tomando el residuo módulo 11; sirve para detectar errores de digitación, no para saber si el contribuyente existe.

1. Qué es el dígito de verificación#

Un NIT colombiano se escribe como 890.903.938-8: el último número, después del guion, es el dígito de verificación (DV). Se calcula a partir de los demás dígitos con un método de módulo 11, y sirve para detectar errores de digitación al capturar el número en un formulario, una factura o una base de datos.

Validar el DV es una comprobación matemática. Un NIT con el DV correcto puede no pertenecer a ningún contribuyente, y uno inexistente puede pasar la validación. Para confirmar que un contribuyente existe hay que consultar el RUT o los servicios de la DIAN.

Documentación: Siempre al Día: dígito de verificación del NIT ↗

2. El algoritmo paso a paso#

Las fuentes consultadas coinciden en los pasos: tomar los dígitos del NIT sin el DV, de derecha a izquierda; multiplicar cada uno por su peso de la serie de primos 3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67 y 71; sumar los productos y calcular el residuo de dividir entre 11. Si el residuo es 0 o 1, ese es el DV; si es mayor, el DV es 11 menos el residuo.

Dígito (de derecha a izquierda)PesoProducto
8324
3721
913117
31751
0190
923207
0290
937333
841328
Suma—1.081

Con el NIT 890903938 (cuyo DV publicado en la fuente es 8), los productos suman 1.081. Como 1.081 dividido entre 11 deja residuo 3, el DV es 11 − 3 = 8.

Una de las guías consultadas aplica los pesos de izquierda a derecha; el cálculo que reproduce el ejemplo publicado es el de derecha a izquierda, que es el que usa el código de esta guía.

Documentación: Lookuptax: guía del NIT en Colombia ↗ · Actualícese: calculadora del dígito de verificación ↗

3. Código en Python y JavaScript#

Las dos funciones aceptan el NIT con puntos o guiones, ignoran cualquier carácter que no sea un dígito y rechazan números de más de 15 dígitos, que es la longitud de la serie de pesos. Los casos de prueba son NIT de ejemplo y su DV calculado con el mismo método.

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

def digito_verificacion(nit: str) -> int:
    """Dígito de verificación (módulo 11) de un NIT sin el dígito final."""
    digitos = [c for c in nit if c.isdigit()]
    if not digitos or len(digitos) > len(PESOS):
        raise ValueError("el NIT debe tener entre 1 y 15 dígitos")
    suma = sum(int(d) * p for d, p in zip(reversed(digitos), PESOS))
    residuo = suma % 11
    return residuo if residuo < 2 else 11 - residuo

def es_valido(nit_completo: str) -> bool:
    """Valida un NIT con su dígito final: '890.903.938-8' o '8909039388'."""
    solo = [c for c in nit_completo if c.isdigit()]
    return len(solo) >= 2 and digito_verificacion("".join(solo[:-1])) == int(solo[-1])

for nit, dv in [("890903938", 8), ("800197268", 4), ("899999068", 1), ("900123456", 8)]:
    print(nit, digito_verificacion(nit), digito_verificacion(nit) == dv)
print(es_valido("890.903.938-8"), es_valido("890.903.938-7"))
Python 3, sin dependencias. Imprime cuatro verificaciones en True y luego True/False para el NIT bien y mal digitado.
javascript
const PESOS = [3, 7, 13, 17, 19, 23, 29, 37, 41, 43, 47, 53, 59, 67, 71];

function digitoVerificacion(nit) {
  const digitos = [...String(nit)].filter(c => c >= "0" && c <= "9").reverse();
  if (digitos.length === 0 || digitos.length > PESOS.length) throw new Error("el NIT debe tener entre 1 y 15 dígitos");
  const suma = digitos.reduce((acc, d, i) => acc + Number(d) * PESOS[i], 0);
  const residuo = suma % 11;
  return residuo < 2 ? residuo : 11 - residuo;
}

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

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

Documentación: Python: str.isdigit ↗ · MDN: Array.prototype.reduce ↗

4. Qué no te dice la validación#

El DV solo prueba que los dígitos son coherentes entre sí. Tres cosas quedan fuera:

  • Existencia: un NIT con DV correcto puede no estar inscrito en el RUT.
  • Identidad: no dice a quién pertenece ni si está activo.
  • Tipo de documento: la cédula de una persona natural se valida con el mismo método cuando se usa como NIT, pero un número que no sea NIT puede coincidir por azar.

Valida el DV en el formulario para pedirle al usuario que corrija un error de digitación, y confirma contra la fuente oficial cuando el dato tenga consecuencias, como una factura electrónica.

5. Buenas prácticas al implementarlo#

  • Guarda el NIT y el DV por separado, y calcula el DV al mostrarlo para detectar datos corruptos.
  • Normaliza antes de comparar: quita puntos, espacios y guiones para buscar duplicados.
  • Escribe pruebas con NIT conocidos, incluidos los que dan residuo 0 y 1, porque ahí se rompen las implementaciones con un error en la regla.
  • No uses esta validación como control de seguridad ni como prueba de identidad.

Para profundizarPostgreSQL: encuentra el índice correcto con EXPLAIN

6. Mantén tus cifras al día#

Los pesos y la regla de módulo 11 son estables, pero la normativa de la DIAN sobre el NIT y el RUT cambia. Las fuentes de esta guía son guías contables y tributarias consultadas el 18 de octubre de 2026; confirma con la DIAN antes de usar la validación en procesos regulados.

  • Vuelve a revisar la fuente oficial al integrarte con facturación electrónica.
  • Incluye pruebas con residuos 0 y 1 en tu suite.
  • Si guardas NIT de otros países, no apliques esta regla a ellos.

Fuentes y alcance

Documentación consultada el 18 de octubre de 2026. Los ejemplos y criterios de decisión son propuestas editoriales; adáptalos al contrato de tu aplicación y valídalos en tu entorno de pruebas autorizado.

Compara estas opciones

Compara bases de datos

Revisa tarifas, límites, condiciones y fuentes de cada opción.

Abrir comparador
Asesoría

¿Tu caso es distinto?

Cuéntanos tu contexto y las opciones que estás evaluando. Te respondemos con criterios y fuentes, sin suscripciones automáticas.

Solicita asesoría