Ú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
- 1Escolha o sentido da conversão. Número para romano, ou romano para número — os dois campos funcionam em paralelo.
- 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 |
|---|---|---|---|
| I | 1 | L | 50 |
| V | 5 | C | 100 |
| X | 10 | D | 500 |
| — | — | M | 1000 |
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.