使用方法
- 「阿拉伯数字」默认填 1994(示例值,与上面结果区和下面示例三处一致),允许 1~3999 的整数。
- 「罗马数字」默认填 MCMXCIV,只接受 ASCII 的
I V X L C D M七个字母,大小写都可以,空格会被忽略。 - 两个输入框是双向联动的:改数字,罗马数字跟着变;改罗马数字,数字跟着变。在任一输入框里按 Enter 也会立刻重算。
- 需要超出 3999 时勾选「允许超过 3999(vinculum 上划线写法)」,把上限放宽到 3999999,超过 1000 的部分会用组合上划线
U+0305标出。 - 下方对照表从「对照表起始」开始连续列出 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 反查。
- 贪心分解:1994 →
M(1000) → 剩 994 →CM(900) → 剩 94 →XC(90) → 剩 4 →IV(4) → 剩 0,得到 MCMXCIV; - 拆解式写作
1000 + 900 + 90 + 4 = 1994,其中CM(900)、XC(90)、IV(4) 都是减法对,共 3 对; - 结果长度 7 个字符,落在 1~3999 全部规范写法的长度区间(1~15)之内;
- 1~3999 全部写一遍平均长度是 7.502 字符,总字符数正好 30000 个;
- 最长的规范写法是 3888 =
MMMDCCCLXXXVIII,15 个字符,也是全范围内唯一一个 15 字符的数; - 3999 =
MMMCMXCIX,是标准写法能表示的最大值。
反过来,把 MCMXCIV 粘进这个古罗马数字转换器的罗马数字输入框,解析器会依次吃掉 M(1000)、CM(900)、XC(90)、IV(4),回到 1994;把 IIII 粘进去,会得到“非规范写法,读作 4,规范写法是 IV”的提示,而不是干巴巴的“输入有误”。
取值对照表与非标准扩展写法
第一张表是 1~3999 范围内所有带减法对的取值,以及六对减法写法各自出现的次数统计。次数的算法是:把 1~3999 每个数都写成规范罗马数字,再统计目标子串出现多少次。
| 减法对 | 表示的值 | 典型数字 | 在 1~3999 中出现次数 |
|---|---|---|---|
| IV | 4 | IV、XIV、XLIV、MCMXCIV | 400 次 |
| IX | 9 | IX、XIX、XLIX、MMMCMXCIX | 400 次 |
| XL | 40 | XL、XLI、CDXLIV | 400 次 |
| XC | 90 | XC、XCIX、MCMXCIV | 400 次 |
| CD | 400 | CD、CDXLIV | 400 次 |
| CM | 900 | CM、CMXCIX、MMMCMXCIX | 400 次 |
六对合计出现 2400 次,正好是 6 × 400——因为每一对在一千以内各出现 400 次,四个千位分段(1~999、1000~1999、2000~2999、3000~3999)里只有前三个含这六对的位置不同,最终每对落在同一个计数上。第二张表是非标准扩展字符的码位,写文档时很容易把它们和 ASCII 字母混用:
| 字符 | 码位 | Unicode 名称 | 表示的值 | 能否被只认 ASCII 的解析器识别 | 备注 |
|---|---|---|---|---|---|
| ↀ | U+2180 | ROMAN NUMERAL ONE THOUSAND C D | 1000 | 不能 | 古罗马「CIƆ」竖排合体字的字形,和 M 等价但码位完全不同 |
| Ⅿ | U+216F | ROMAN NUMERAL ONE THOUSAND | 1000 | 不能 | 兼容字符,NFKC 归一化后会变成 ASCII 的 M |
| ↁ | U+2181 | ROMAN NUMERAL FIVE THOUSAND | 5000 | 不能 | 等价于 V̅ |
| ↂ | U+2182 | ROMAN NUMERAL TEN THOUSAND | 10000 | 不能 | 等价于 X̅ |
| Ⅰ | U+2160 | ROMAN NUMERAL ONE | 1 | 不能 | NFKC 后会变成 ASCII 的 I |
| V̅ | V + U+0305 | LATIN CAPITAL LETTER V + COMBINING OVERLINE | 5000 | 不能 | vinculum 写法,两个码位算一个“字” |
| M̅ | M + U+0305 | LATIN CAPITAL LETTER M + COMBINING OVERLINE | 1000000 | 不能 | 同上,上划线表示乘以一千 |
输入范围、边界与精度说明
下面这些是刻意设定的边界,知道它们能避免把这页当“万能记数转换器”用:
- 标准范围 1~3999。下界是 1:罗马数字没有表示 0 的符号,也没有负数记法。上界是 3999:符号 M 最多写三次(罗马人不用 MMMM 表示 4000),所以 3999 =
MMMCMXCIX是标准写法的天花板。 - 勾选扩展后上限 3999999。靠 vinculum 上一层上划线实现,只叠一层;再大的数需要两层上划线或其他记法,本页不支持。
- 4096 不是上限而是巧合。常有人以为罗马数字上限是 4096,其实那是把 Unicode 里罗马数字区块(U+2160~U+2183,共 36 个码位)能表示的字符数量当成了数值上限。区块能装的字符数和能表示的数值是两个概念。
- 最长写法是 15 个字符。1~3999 里写法最长的是 3888 =
MMMDCCCLXXXVIII,也是唯一一个 15 字符的数;平均长度 7.502 字符。超过 15 位字符的串一定不是规范写法。 - 大小写都会被接受。解析前统一转成大写,所以
mcmxciv也能还原成 1994;但输出的规范写法一律是大写。 - 只认 ASCII 的七个字母。输入
Ⅿ(U+216F)、ↀ(U+2180)这类 Unicode 兼容字符会被直接拒绝并指出具体字符——它们看起来是罗马数字,但码位不在I V X L C D M里,任何只按 ASCII 判断的解析器都会失败。 - 非规范写法会被读出值而不是拒绝。
IIII读作 4 并提示规范写法是IV;IC按贪心解析读作 101(I + C),规范写法应是CI。读出的值是工具的解释,不代表这种写法在历史上被认可。 - vinculum 用组合字符实现,是“两个码位一个字”。做字符数统计时
V̅会算成 2 个码位、M̅CMXCIV会算成 9 个码位;某些字体下上划线会和字母贴得太近甚至不显示,复制到不支持组合字符的环境里可能散开成“V 加一个小横线”。
常见问题
为什么 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 写法。