Última atualização: 8 de setembro de 2026

Conversor de Números Romanos

Converta números arábicos (1-3999) para romanos, ou números romanos para arábicos, nos dois sentidos.

Número → Romano

=

Aceita números de 1 a 3999 (limite da notação romana padrão).

Romano → Número

=

Como usar o Conversor de Números Romanos

  1. 1Escolha o sentido da conversão. Número para romano, ou romano para número — os dois campos funcionam em paralelo.
  2. 2Digite o valor. O resultado aparece automaticamente, sem precisar clicar em nada.

Como funciona a notação romana

O sistema romano combina sete símbolos de valor fixo. Na maioria das posições os valores se somam (VI = 5 + 1 = 6), mas quando um símbolo de valor menor vem antes de um maior, ele é subtraído (IV = 5 − 1 = 4) — essa é a "notação subtrativa" que costuma confundir na hora de implementar a conversão.

Símbolo Valor Símbolo Valor
I1L50
V5C100
X10D500
M1000

Não existe símbolo para zero nem para números negativos, e a notação padrão vai só até 3999 (MMMCMXCIX) — acima disso seriam necessários símbolos adicionais fora do teclado padrão. Apesar de "obsoleto", o sistema ainda aparece em UI real: numeração de capítulos, edições de eventos (Super Bowl LVIII), nomes de monarcas e papas, e mostradores de relógio.

Caso de teste clássico: uma implementação ingênua de romano → número que apenas soma os valores dos símbolos, sem checar a subtração, converte "IV" para 6 (I + V) em vez de 4. Testar especificamente os pares subtrativos (IV, IX, XL, XC, CD, CM) expõe esse tipo de bug.

Exemplo de código: conversão nos dois sentidos em JavaScript

A mesma lógica usada por este conversor, incluindo a validação que rejeita grafias inválidas:

function arabicoParaRomano(num) {
  const mapa = [
    [1000, 'M'], [900, 'CM'], [500, 'D'], [400, 'CD'],
    [100, 'C'], [90, 'XC'], [50, 'L'], [40, 'XL'],
    [10, 'X'], [9, 'IX'], [5, 'V'], [4, 'IV'], [1, 'I']
  ];
  let resultado = '';
  for (const [valor, simbolo] of mapa) {
    while (num >= valor) { resultado += simbolo; num -= valor; }
  }
  return resultado;
}

function romanoParaArabico(str) {
  const valores = { I: 1, V: 5, X: 10, L: 50, C: 100, D: 500, M: 1000 };
  let resultado = 0;
  for (let i = 0; i < str.length; i++) {
    const atual = valores[str[i]];
    const proximo = valores[str[i + 1]];
    resultado += (proximo && atual < proximo) ? -atual : atual;
  }
  // Reconverter e comparar barra grafias invalidas como "IIII"
  return arabicoParaRomano(resultado) === str ? resultado : null;
}

Casos de teste sugeridos para um conversor de números romanos

  • Os seis pares subtrativos (IV, IX, XL, XC, CD, CM), o ponto onde implementações ingênuas mais falham.
  • O menor (1 = I) e o maior (3999 = MMMCMXCIX) valor aceito pela notação clássica.
  • Grafias inválidas por repetição excessiva (IIII, VV, XXXX), que uma validação correta deve rejeitar mesmo que a soma "pareça" fazer sentido.
  • Entrada em minúsculo (ex.: "mcmxciv"), para confirmar que a normalização de maiúsculas acontece antes da validação.

Perguntas Frequentes

Por que o conversor só aceita de 1 a 3999?

É o limite da notação romana clássica usando apenas os sete símbolos padrão (I, V, X, L, C, D, M). Representar números maiores exigiria uma notação estendida (como uma barra sobre o símbolo para multiplicar por mil), que não é de uso corrente.

O conversor aceita números romanos em minúsculo?

Sim, a entrada é convertida automaticamente para maiúsculo antes de processar, já que a notação romana tradicionalmente usa apenas letras maiúsculas.

O que acontece se eu digitar um número romano inválido, como "IIII" ou "VV"?

O conversor detecta a inconsistência reconvertendo o resultado de volta para romano e comparando com o que foi digitado — se não bater, o campo mostra "Inválido", em vez de aceitar uma grafia que não segue as regras da notação.

Copiado com sucesso!