O PIS (Programa de Integração Social) e o PASEP (Programa de Formação do Patrimônio do Servidor Público) utilizam a mesma estrutura de numeração do NIS (Número de Identificação Social). Essa chave de 11 dígitos é amplamente utilizada em cadastros trabalhistas, sistemas de RH, folhas de pagamento e ERPs no Brasil.
Neste guia prático, vamos analisar a estrutura matemática do PIS/PASEP, aprender como calcular o seu dígito verificador utilizando a regra de Módulo 11 e disponibilizar exemplos de código prontos para integrar em seus sistemas.
Estrutura do PIS/PASEP
O PIS/PASEP é composto por 11 dígitos numéricos e geralmente se apresenta no formato formatado XXX.XXXXX.XX-X:
| Componente | Posição | Função |
|---|---|---|
| Identificador único | 1 a 10 | Número base gerado sequencialmente |
| Dígito Verificador | 11 | Checksum para validação da estrutura |
O Algoritmo de Validação (Módulo 11)
O cálculo do dígito verificador do PIS baseia-se na multiplicação de seus primeiros 10 dígitos por uma lista de pesos específicos, seguida pela divisão modular por 11.
Passo a Passo do Cálculo
- Pegue os primeiros 10 dígitos do PIS.
- Multiplique cada dígito pelos pesos:
3, 2, 9, 8, 7, 6, 5, 4, 3, 2(da esquerda para a direita). - Some todos os resultados das multiplicações.
- Calcule o resto da divisão da soma por 11.
- Subtraia o resto de 11 (
Diferença = 11 - resto). - Se a diferença for 10 ou 11, o dígito verificador é
0. Caso contrário, o dígito é a própria diferença.
Exemplo Prático
Vamos validar o PIS hipotético 120.42283.47-5:
Dígitos: 1 2 0 4 2 2 8 3 4 7
Pesos: 3 2 9 8 7 6 5 4 3 2
Multiplicações:
1×3 = 3
2×2 = 4
0×9 = 0
4×8 = 32
2×7 = 14
2×6 = 12
8×5 = 40
3×4 = 12
4×3 = 12
7×2 = 14
Soma = 3 + 4 + 0 + 32 + 14 + 12 + 40 + 12 + 12 + 14 = 145
Resto = 145 % 11 = 2
Dígito = 11 - 2 = 9 (Diferente de 5) → PIS Inválido!
Implementação em JavaScript / TypeScript
Esta função limpa a formatação do input e valida a chave com base no algoritmo oficial:
function validarPIS(pis) {
// Remove caracteres não numéricos
const cleaned = pis.replace(/\D/g, "");
// Deve possuir exatamente 11 dígitos
if (cleaned.length !== 11) return false;
// Rejeita padrões conhecidos com dígitos todos repetidos
if (/^(\d)\1{10}$/.test(cleaned)) return false;
const pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2];
let soma = 0;
for (let i = 0; i < 10; i++) {
soma += parseInt(cleaned.charAt(i), 10) * pesos[i];
}
const resto = soma % 11;
const diferenca = 11 - resto;
const digitoVerificador = (diferenca === 10 || diferenca === 11) ? 0 : diferenca;
return digitoVerificador === parseInt(cleaned.charAt(10), 10);
}
// Exemplos
console.log(validarPIS("120.42283.47-9")); // true
console.log(validarPIS("111.11111.11-1")); // false
Implementação em Python
Uma versão simples e legível em Python para utilizar em seus backend ou scripts de validação de dados:
def validar_pis(pis: str) -> bool:
# Remove qualquer caractere não numérico
cleaned = "".join(filter(str.isdigit, pis))
# Verifica o tamanho do documento
if len(cleaned) != 11:
return False
# Evita falsos positivos com dígitos repetidos
if len(set(cleaned)) == 1:
return False
pesos = [3, 2, 9, 8, 7, 6, 5, 4, 3, 2]
soma = sum(int(cleaned[i]) * pesos[i] for i in range(10))
resto = soma % 11
diferenca = 11 - resto
digito_verificador = 0 if diferenca in (10, 11) else diferenca
return digito_verificador == int(cleaned[10])
# Exemplos
print(validar_pis("120.42283.47-9")) # True
print(validar_pis("000.00000.00-0")) # False
Implementação em C#
using System;
using System.Linq;
public static class PISValidator
{
public static bool Validate(string pis)
{
if (string.IsNullOrEmpty(pis)) return false;
// Remove caracteres não numéricos
string cleaned = new string(pis.Where(char.IsDigit).ToArray());
if (cleaned.Length != 11) return false;
// Evita repetidos conhecidos
if (cleaned.Distinct().Count() == 1) return false;
int[] pesos = { 3, 2, 9, 8, 7, 6, 5, 4, 3, 2 };
int soma = 0;
for (int i = 0; i < 10; i++)
{
soma += (cleaned[i] - '0') * pesos[i];
}
int resto = soma % 11;
int diferenca = 11 - resto;
int digitoVerificador = (diferenca == 10 || diferenca == 11) ? 0 : diferenca;
return digitoVerificador == (cleaned[10] - '0');
}
}
Erros Comuns na Validação do PIS
- Não sanitizar a string: PIS/PASEP costuma vir com traços e pontos no banco de dados. Limpe tudo com regex ou filtros antes de aplicar o cálculo.
- Não verificar sequências repetidas: Chaves compostas por apenas um dígito repetido (ex:
111.11111.11-1) podem passar no cálculo aritmético do Módulo 11 por coincidência matemática. Sempre valide a unicidade dos dígitos. - Falta de conversão nas ferramentas: Lembre-se de fornecer links rápidos para geradores de PIS na sua interface de desenvolvimento para que o time de testes consiga gerar massa de dados fictícios sem complicação.
🛠️ Experimente na prática
Use nossas ferramentas online gratuitas — sem cadastro, direto no navegador.
