古罗马数字转换器

在 1~3999 的标准范围里双向互转:数字转罗马数字走贪心匹配与减法记法,罗马数字转数字按符号权重逐段还原,并逐项拆出 IV、IX、XL、XC、CD、CM 六对减法写法。

扩展选项
MCMXCIV
1000 + 900 + 90 + 4 = 1994

上方是 1994(默认示例)的转换结果。在任一输入框里按 Enter 即可转换;两个输入框双向联动,改哪一个都会重算另一个。「对照表」从「对照表起始」开始连续列出 12 行,点「加载更多」继续。

阿拉伯数字罗马数字长度
1I1
2II2
3III3
4IV2
5V1
6VI2
7VII3
8VIII4
9IX2
10X1
11XI2
12XII3

使用方法

  1. 「阿拉伯数字」默认填 1994(示例值,与上面结果区和下面示例三处一致),允许 1~3999 的整数。
  2. 「罗马数字」默认填 MCMXCIV,只接受 ASCII 的 I V X L C D M 七个字母,大小写都可以,空格会被忽略。
  3. 两个输入框是双向联动的:改数字,罗马数字跟着变;改罗马数字,数字跟着变。在任一输入框里按 Enter 也会立刻重算。
  4. 需要超出 3999 时勾选「允许超过 3999(vinculum 上划线写法)」,把上限放宽到 3999999,超过 1000 的部分会用组合上划线 U+0305 标出。
  5. 下方对照表从「对照表起始」开始连续列出 12 行,点「加载更多」继续往下,「复制对照表」导出 TSV,「下载 CSV」导出带 BOM 的文件。

这个古罗马数字转换器能解决什么问题

一是读写对照:文档、版权页、章节号、电影年份里出现的罗马数字,只要不是纯记忆,就能立刻还原成阿拉伯数字——MMXXVI 是 2026,MCMXCIV 是 1994。

二是看穿减法记法:罗马数字不是“把符号加起来”那么简单,IV 是 4 而不是 6,CM 是 900 而不是 1100。这个古罗马数字转换器会把结果逐段拆成 1000 + 900 + 90 + 4 这样的求和式,减法对一眼可见。

三是批量出对照表:做教材、试卷、表格模板时,一次导出 1~100 的完整对照,不用一个个查。

四是校验别人写的罗马数字:输入 IIII、IC 这类非规范写法时,工具不会直接报错拒绝,而是先按符号权重读出一个值,再告诉你规范写法应该是什么。

本页不做这些事:不转换中文数字、不转换希腊数字或其他古文字记数系统;超过 3999999 的数不支持(vinculum 只叠一层上划线);也不判断某个罗马数字写法在历史上“应该”怎么写——历史上加法写法与减法写法并存,本页只以今天通用的规范写法为基准。

转换原理:贪心匹配、六对减法记法与 vinculum

数字转罗马数字用的是贪心匹配:把 13 个「值—符号」对按值从大到小排成一张表 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,从 1000 那一格开始,只要剩余的数不小于当前值就拼一次符号、减一次值,减不动了再往下一格走。整个过程对任何输入都不会回溯,所以是最简写法。

关键在表里那六个减法对:IV = 4、IX = 9、XL = 40、XC = 90、CD = 400、CM = 900。它们的存在让 4 写成 IV 而不是 IIII,让 900 写成 CM 而不是 DCCCC。为什么减法只允许这六对?因为罗马人只对紧邻的两档做减法:I 可以减 V 和 X,X 可以减 L 和 C,C 可以减 D 和 M;IL(50−1)、IC(100−1)、XD(500−10)、XM(1000−10)都不算合法——想写 49 只能是 XLIX,不能是 IL。

反向解析按符号权重逐段消费:同样用那张 13 项的升序表从左往右匹配,一位一位吃下去。吃到一半吃不下去就说明字符串有问题。因为表里已经含有 900、400、90、40、9、4 这些“两字符”项,所以 CM 会被当成一个整体读作 900,而不是分开读成 1100。解析完成后比较还原结果与原串:一致就说明是规范写法,不一致就说明是 IIII、IC 这类非规范写法,工具会给出规范写法。

vinculum(上划线)是罗马数字唯一的“乘以一千”机制:在符号上加一条横线,表示这个符号的值乘 1000。实现上用的是组合字符 U+0305 COMBINING OVERLINE,写在被标记字符后面,所以 V 加 U+0305 显示成 V̅ 表示 5000,M 加 U+0305 显示成 M̅ 表示 1000000,而 4000 写成 I̅V̅(I 与 V 各带一条上划线,即 4 × 1000)。把 1994 写成 vinculum 形式就是 M̅CMXCIV,一共 9 个码位。

完整示例(数值仅作演示)

示例条件与页面默认值完全一致:阿拉伯数字 1994,罗马数字输入框为空时按 1994 反查。

反过来,把 MCMXCIV 粘进这个古罗马数字转换器的罗马数字输入框,解析器会依次吃掉 M(1000)、CM(900)、XC(90)、IV(4),回到 1994;把 IIII 粘进去,会得到“非规范写法,读作 4,规范写法是 IV”的提示,而不是干巴巴的“输入有误”。

取值对照表与非标准扩展写法

第一张表是 1~3999 范围内所有带减法对的取值,以及六对减法写法各自出现的次数统计。次数的算法是:把 1~3999 每个数都写成规范罗马数字,再统计目标子串出现多少次。

减法对表示的值典型数字在 1~3999 中出现次数
IV4IV、XIV、XLIV、MCMXCIV400 次
IX9IX、XIX、XLIX、MMMCMXCIX400 次
XL40XL、XLI、CDXLIV400 次
XC90XC、XCIX、MCMXCIV400 次
CD400CD、CDXLIV400 次
CM900CM、CMXCIX、MMMCMXCIX400 次

六对合计出现 2400 次,正好是 6 × 400——因为每一对在一千以内各出现 400 次,四个千位分段(1~999、1000~1999、2000~2999、3000~3999)里只有前三个含这六对的位置不同,最终每对落在同一个计数上。第二张表是非标准扩展字符的码位,写文档时很容易把它们和 ASCII 字母混用:

字符码位Unicode 名称表示的值能否被只认 ASCII 的解析器识别备注
ↀU+2180ROMAN NUMERAL ONE THOUSAND C D1000不能古罗马「CIƆ」竖排合体字的字形,和 M 等价但码位完全不同
ⅯU+216FROMAN NUMERAL ONE THOUSAND1000不能兼容字符,NFKC 归一化后会变成 ASCII 的 M
ↁU+2181ROMAN NUMERAL FIVE THOUSAND5000不能等价于 V̅
ↂU+2182ROMAN NUMERAL TEN THOUSAND10000不能等价于 X̅
ⅠU+2160ROMAN NUMERAL ONE1不能NFKC 后会变成 ASCII 的 I
V̅V + U+0305LATIN CAPITAL LETTER V + COMBINING OVERLINE5000不能vinculum 写法,两个码位算一个“字”
M̅M + U+0305LATIN CAPITAL LETTER M + COMBINING OVERLINE1000000不能同上,上划线表示乘以一千

输入范围、边界与精度说明

下面这些是刻意设定的边界,知道它们能避免把这页当“万能记数转换器”用:

常见问题

为什么 4 是 IV 而不是 IIII?

因为今天通行的规范写法用减法:4 = 5 − 1,写成 IV。古罗马早期更常用加法写法 IIII,中世纪以后减法写法才成为主流,到印刷时代被固定下来。这也是为什么很多钟表表盘上仍然写 IIII——那是“钟表匠的四”(watchmaker's four),沿用古法。

钟表上为什么用 IIII,别的地方却用 IV?

历史惯性与视觉平衡两方面原因。一方面表盘沿用更古老的加法写法;另一方面表盘上有 VIII(8,四个字符),4 若写 IV 只有两个字符,与 8 放在一起左右不对称,写 IIII 正好四对四。伦敦大本钟、巴黎圣母院等不少著名钟楼都用 IIII。表盘上的 IIII 是排版惯例,不是本页意义上的“错误写法”。

为什么减法的对象只能是 I、X、C 三个符号?

因为只有这三个符号可以放到比它大的紧邻档左边做减法:I 减 V 和 X,X 减 L 和 C,C 减 D 和 M。V、L、D 是所谓的“五进制符号”,它们不能出现在减数位置,所以 IL、IC、XD、XM 一律非法。49 只能是 XLIX,99 只能是 XCIX。

输入 MMMM 会怎么样?

工具会拒绝。因为 4000 已经超出 3999 的标准上限,而符号 M 在规范写法里最多连续出现三次。要表示 4000,需要勾选「允许超过 3999」改用 vinculum 写法 I̅V̅,或者用 ↁ 这类扩展字符。

复制出来的罗马数字为什么带上划线?

因为上划线本身是内容的一部分。vinculum 用的是组合字符 U+0305 COMBINING OVERLINE,它必须写在被标记字符的后面才能组合成一个带横线的字形,所以 V̅ 实际是两个码位、M̅ 同样是两个码位。如果目标环境不支持组合字符,横线可能显示不出来——这不是转换出错,而是渲染问题。

为什么 3999 是上限?

规范写法里同一符号最多连续出现三次、最多只能减一个符号,因此用 I V X L C D M 七个字母能表示的最大值是 3999 = MMMCMXCIX。想表示 4000 就必须引入新的机制——要么 vinculum 上划线(×1000),要么用 ↀ、ↁ 这类专门的扩展字符。

输入小写或者带空格可以吗?

可以。解析前会去掉所有空白字符并统一转成大写,所以 mcmxciv、MCM XCIV 都能正确还原成 1994。输出的规范写法一律是大写字母,不带空格。

对照表和单个转换用的是同一套算法吗?

是。古罗马数字转换器的对照表每一行都直接调用同一个转换函数,所以不会出现“单个转换对、批量转换错”的情况。对照表的取值区间限定在 1~3999 的规范写法内,不会输出 vinculum 写法。

相关工具