单位换算:长度、重量、温度与数据大小
长度、重量、体积、面积、速度、温度、数据大小与时间,八大类共 76 个单位互转,输入即出结果。 这里每一个系数都是定义值 —— 1 英寸正好 25.4 毫米,是 1959 年国际码磅协定规定的,不是谁量出来的 —— 所以这一页不存在「数据过期」,也不会被任何行情变化带偏。数据大小会同时给出十进制与二进制两种写法, 因为硬盘标签上的「500 GB」和系统里的「465 GB」是同一批字节的两种读法。温度则用「刻度比 + 偏移量」表示: 低于绝对零度照样算出来,并明确告诉你它越界了,而不是悄悄夹到最低值。
—
—————这个大类下的每一个单位
同一批字节的两种写法
———上面两行是同一个量在两套前缀体系下的写法,谁也不比谁「更真」: 它们是两个不同的单位,只是名字长得像。
温度
——开尔文是这里的基准标度,也是本页唯一有真实零点的标度。 摄氏度与华氏度是仿射的:一个刻度比加一个偏移量 —— 这就是它们不能靠「乘一个数」换算的原因。
你在上面输入的内容不会发给我们:整页换算都在你已经打开的标签页里完成, 也正因为如此它不限次数。详见隐私说明。
怎么用
- 先选大类,再选两个单位。大类决定了有哪些单位:纳米、千焦、KiB 和华氏度不可能挤在同一张有意义的清单里, 所以两个单位下拉是按大类自己的单位表现填的。每个大类默认给的那一对是最常用的那一对 —— 米到英尺、千克到磅、GB 到 GiB。
- 填数值,边打边看。每敲一个字符结果就跟着变,所以单位是不是搞反了、数字量级对不对,立刻能看出来, 不用等到贴进别的地方才发现。结果区最上面那一行就是这次换算的整句话:你输入的是什么,它等于什么。
- 先读黄色的提示,再决定要不要信这个数。"我替你做过了什么"都写在提示里:用到的那条定义值、 数据大类下的两套字节约定、输入位数超过双精度能精确表示的位数、以及显示值与原值已经不一样的那两种情况。
- 要反着算就用「对调单位」,别手工重打。把结果抄到另一个框里恰恰是最容易掉一位数字的步骤, 而且抄完就再也看不出你原本是在做一次往返自检了。
- 默认精度不够用时再调。8 位有效数字适合快速看一眼,却不适合一个要抄进报告里的数字。 精度只改显示,机器算出的原始值一直列在旁边,所以你随时能看出四舍五入到底拿掉了多少。
换算到底是怎么算的
这一页上所有比例类的大类都走同一条路:先换进一个基准单位,再换算出来,一共三步。这三步值得写清楚, 因为换算的准确度和它的失败方式都藏在这里。
- 输入值换进基准单位。你填的数乘上你选的那个单位的系数。长度用米、质量用千克、体积用升、 面积用平方米、速度用米每秒、时间用秒、数据大小用字节。
- 基准单位换成目标单位。把上一步的值除以你选的目标单位的系数。
- 清理,再格式化。结果先清理到 14 位有效数字(去掉二进制浮点噪声),再按你选的精度写出来。
所以"英寸换厘米"就是 1 × 0.0254 ÷ 0.01 = 2.54。结果区里的「换算系数」那一行直接给出合并后的比例 ——
1 in = 2.54 cm —— 如果你怀疑答案,拿这一行去和任何一张换算表对照就行。
温度是唯一的例外
摄氏度与华氏度没办法写成一个系数,因为它们的零点含义不同。经过开尔文,换算是
K = °C + 273.15 与 K = (°F + 459.67) / 1.8,
也就是把基准值再按目标标度的公式倒推回去。偏移量完整写出来、不折进一个常数里;
而且这一对公式是按"先把温度补到绝对零度、再除以刻度比"选的,所以四个物理锚点 ——
冰点、沸点、−40 与绝对零度 —— 换过去再换回来得到的是你输入的那个数,而不是差最后一位的数。
八个大类各有多少个单位
| 大类 | 基准单位 | 单位数 | 里面都有什么 |
|---|---|---|---|
| 长度 | 米 | 11 | m、km、cm、mm、µm、nm、in、ft、yd、mi、nmi |
| 重量与质量 | 千克 | 11 | kg、t、g、mg、µg、lb、oz、st、ct、美吨、英吨 |
| 体积与容积 | 升 | 14 | L、m³、mL、cm³、美制与英制加仑、夸脱、品脱、杯、液量盎司、汤匙、茶匙 |
| 面积 | 平方米 | 10 | m²、km²、cm²、mm²、公顷、英亩、in²、ft²、yd²、mi² |
| 速度 | 米每秒 | 5 | m/s、km/h、mph、ft/s、节 |
| 温度 | 开尔文 | 4 | °C、°F、K、°R |
| 数据大小 | 字节 | 12 | B、bit、kB、MB、GB、TB、PB、KiB、MiB、GiB、TiB、PiB |
| 时间 | 秒 | 9 | s、ns、µs、ms、min、h、天、周、儒略年 |
上面这些数字和清单不是"写一次就烂在那里"的说明文字:结果区会把当前大类的完整单位清单列出来, 而那份清单与上面的表都来自核心模块本身,单位数还有测试逐条比对。以后加一个单位,这张表要么跟着改,要么构建失败。
为什么系数是定义值,而不是测量值
这个站有一条贯穿所有工具的原则:一个数字必须能说清它从哪来。对换算来说,这就意味着系数必须是 定义值 —— 被协定或标准规定下来的数 —— 而不是测量值或价格。
这里用到的定义全都是这一类:
1 in = 25.4 mm,正好,来自 1959 年国际码磅协定。这一行同时定住了英尺、码、英里和平方英里 —— 所以 1 英里正好是 1609.344 米,不是"大约是"。1 lb = 0.45359237 kg,正好,同一个协定。盎司、英石、美吨与英吨都由它按整数比推出来。1 美制加仑 = 231 in³,1836 年由美国国会法案确定。美制的夸脱、品脱、杯、液量盎司、汤匙与茶匙都由它推出来。1 nmi = 1852 m,1929 年国际米制公约确定 —— 它当初被定义成"纬度一分"的长度。1 acre = 4840 yd²、1 ha = 10000 m²,两者都是定义,不是测量。1 KiB = 1024 B,由 IEC 80000-13 规定,整条二进制前缀阶梯都是。1 儒略年 = 365.25 天,国际天文联合会(IAU)的惯例。这里写"儒略年"而不是"一年", 因为两者长度不同。
这些数都不可能变。把它们写进页面,和把它们写进标准文件是同一件事 —— 而这正是它们与本站拒绝发布的那些数字的区别。
故意缺席的四类,以及理由
有四种单位不在表里,每一种都是决定,不是遗漏。
- 汇率与一切行情。汇率是价格,每秒都在变。写一个固定值意味着给出一个过期的数,接实时行情又需要 我们拿不出可引用来源的数据源。所以这一类换算不做 —— 理由写在换算器大类页上。
- 历史与地域变体。尺、寸、斤、两、亩,以及欧洲各国的旧里与旧磅:同一个字在不同朝代、不同地区 是不同的长度与重量。没有"哪一个是错的"这种判断依据,凭印象挑一个就是给用户一个自信的错数字, 而一个自信的错数字比不回答更糟。
- 日历月与日历年。一个月是 28 到 31 天,一年是 365 或 366 天。换成秒必须额外假设"你说的是哪一个", 所以时间清单里只放定长的单位,再加上儒略年,并且如实标注它的身份。
- 马赫。声速随气温与气压变化,所以 1 马赫是一种工况,不是定速。节和英里每小时在表里, 因为它们是定义;马赫不在,因为它不是。
剩下的就是一个"用约定常数做算术、并且把这件事说出来"的换算器。十年后拿同样的输入再算一次, 你会拿到同样的答案 —— 这是换算工具唯一能老实承诺的那种稳定。
十进制与二进制:为什么 1 GB 不是 1 GiB
这是两个人看着同一块硬盘却各说一个数的头号原因,而它是命名问题,不是测量问题。SI 前缀一直是十进制的:
kilo 是 1000,mega 是一百万,giga 是十亿。当计算机内存被证明是按 2 的幂寻址之后,
同一批前缀被借去、并悄悄改成了 1024、1,048,576 这样的含义 —— 于是两套含义同时流通了整整一代人。
IEC 80000-13 在 1998 年把这件事定了下来:给二进制阶梯自己的名字。kB 是 1000 字节,
KiB 是 1024 字节,而差距是累积的 —— 到 GB 这一级已经差 7.4%。
| 十进制(SI) | 字节数 | 二进制(IEC) | 字节数 | 相差 |
|---|---|---|---|---|
| 1 kB | 1,000 | 1 KiB | 1,024 | 2.4% |
| 1 MB | 1,000,000 | 1 MiB | 1,048,576 | 4.9% |
| 1 GB | 1,000,000,000 | 1 GiB | 1,073,741,824 | 7.4% |
| 1 TB | 1,000,000,000,000 | 1 TiB | 1,099,511,627,776 | 10.0% |
所以一块标着 500 GB 的硬盘装的是 500,000,000,000 字节,而按 GiB 显示的文件管理器把它除以 1,073,741,824,
显示 465.66 GiB。两个数都对,只是其中一个用的不是标签上那个单位。在这个页面把 1 填进去、
单位选 GB 和 GiB,它会把同一批字节的两种读数并排列出来,不选谁赢 —— 面对一场源于"单位不同"而不是"算术不同"的争论,
这是唯一老实的做法。
另外两个值得知道的小事。第一,bit 在表里,因为网速是按比特每秒报的:1 比特是八分之一个字节,
所以 100 Mbit/s 的线路最多跑 12.5 MB/s。第二,这一页不区分 kB 与 KB,
因为真实世界里也没有人稳定地区分:十进制千字节的规范符号是小写 k,而大写 K 在实际使用中对两种含义都有人用。
温度:唯一不是比例关系的一类
把 20 °C 乘 2 得不到"40 °C 的什么",而 0 °C 也不是"没有热量" —— 它是水恰好结冰的那个温度,是一个约定。 这一页上只有两个标度从真实的零点开始,它们的名字也说明了这一点:开尔文(SI 基准单位)与兰氏度 (同样的思路,刻度大小与华氏一致)。
正因为如此,摄氏度与华氏度用一对公式处理,而不是一个系数。换算经过开尔文:
| 从 | 换成开尔文 | 从开尔文换出 |
|---|---|---|
| 摄氏度 | K = °C + 273.15 | °C = K − 273.15 |
| 华氏度 | K = (°F + 459.67) / 1.8 | °F = K × 1.8 − 459.67 |
| 开尔文 | K = K | K = K |
| 兰氏度 | K = °R / 1.8 | °R = K × 1.8 |
你可以手算核对的四个锚点是:冰点(0 °C = 32 °F = 273.15 K)、沸点(100 °C = 212 °F = 373.15 K)、 两个标度唯一自洽的点(−40 °C = −40 °F),以及绝对零度(−273.15 °C = −459.67 °F = 0 K)。 把其中任何一个换过去、再换回来,得到的都是你输入的那个数,而不是"差了头发丝那么一点"的数。 这件事比听起来重要:往返差千万亿分之一的换算器,单次换算看起来完全正常, 可你一旦连着换两步,或者拿换算过的值和某个阈值比较,它就会给出没有意义的结论。
华氏公式里还藏着第二个更隐蔽的坑:+ 459.67 相对于一个小数值太大了,所以把 0.001 °C 换成华氏度
再换回来会遭遇"灾难性抵消"。2.4e-14 的绝对误差在绝对意义上什么都不是,但相对于你输入的那个值就是 2.4e-11 ——
往返自检那一行会把绝对差和相对差都给出来,让你自己判断,而不是被一串带十一个零的数字吓到。
精度、舍入与浮点噪声
一个要同时覆盖纳米和公里的页面,不能按固定小数位取整 —— 让 1 米好读的那个设置会把 1 纳米毁掉。 所以精度档位按有效数字给:4、6、8、10、12 位,默认 8 位。围绕它的规则也都写出来,不靠猜。
- 整数部分永远不被截断。1 GB 换成字节写的是
1000000000,不是1.0000000e+9。 精度是"显示多少细节"的声明,不是"可以把一个数换成四舍五入过的另一个数"的许可。 - 末尾的 0 会去掉。
0.30000000写成0.3,因为那些 0 不携带信息。 - 超过 1e16 或低于 1e-6 改用科学计数法,因为一串 0 比一个指数更容易数错。
- 每一步都清理到 14 位有效数字。二进制浮点表示不了 0.1 和 0.3,所以
0.1 米换成微米, 机器算出来是100000.00000000001。14 位比双精度的 15 到 17 位短,又比任何真实测量能到的精度长, 所以它只去掉噪声,不动有物理意义的位。只要这一步真的改动了数值,机器算出的原始值就会和清理后的值一起列在 「机器算出的原始值」那一行里。 - 往返自检有两级,不是一级。第一级把完整精度的结果换回去、和你的输入精确比较;
第二级把显示出来的那个数换回去 —— 也就是从屏幕上抄走的人真正会拿到的值 —— 只要在当前精度下相同就算通过。
只按精确比较判,会把
1 m = 3.2808399 ft写成"不等于你的输入", 而屏幕上两个数读出来都是 1;那种告警只会让人开始怀疑工具,而不是怀疑四舍五入。
有一件事值得直说:「结果」那一行是按当前精度格式化过的值,「机器算出的原始值」那一行才是算术真正算出来的双精度数。 如果你要把这个答案喂给下一步计算,用原始值;如果要给人看,用格式化那一行。
哪些输入会被拒绝,为什么
输入解析这件事,在它悄悄改变答案之前都很无聊 —— 所以这一页宁可拒绝那些含义不明确的写法,也不去猜。 每一次拒绝都给一句具体的话,而不是笼统的"输入无效"。
| 输入 | 为什么拒绝 | 该怎么写 |
|---|---|---|
1,000 | 在欧洲和南美很多地区,逗号是小数点。同一串字符,一个读者读成一千,另一个读成一。 收下它等于替你默默选了一个地区。 | 1000 |
1 000 或 1_000 | 空格分组和下划线分组是排版习惯,在数值输入框里没有公认含义。 | 1000 |
0x1F、0b1010、0o17 | 它们是同一个数的另一种写法,不是另一个量。而这个工具换的是量。 | 十进制数值 |
1e308 米换成纳米 | 换算溢出:结果会是无穷大。把"Infinity"这个词印在结果框里比不给结果更糟, 因为它看起来像一个答案。 | 换一个更小的值,或者更小的单位 |
1e-320 公里换成纳米 | 中间值下溢成 0,结果不携带任何信息。 | 换一个更大的值,或者更大的单位 |
五,或者 5 kg 这种把单位粘上的写法 | 不是数字。这一页不会去猜"数字在哪结束、单位从哪开始", 因为猜错了看不出来。 | 数值填在「数值」框,单位选在下拉里 |
Infinity、NaN | 两者都不是可以换算的数,而且绝不允许出现在结果框里。 | 一个有限值 |
有三种输入是收下的,也值得知道:负号(负的量值会照算并提示,因为 −40 摄氏度的气温是常态,
负的差值也是常态)、科学计数法(1e9、2.5E-3)、以及有效数字比双精度能精确表示的还多的数 ——
它照样算,并附一句说明读到了多少位、被当成了什么值。
有什么东西离开了这个页面
没有。这一页是一个静态文件,引用一份纯函数模块:换算、取整、单位清单、往返自检和提示全都在你打开的这个标签页里跑。 不向我们的服务器发请求、不给你的内容挂统计事件、不写 cookie、不做任何存储。刷新页面,一切都没了, 因为它从来没有到过别的地方。
对一个单位换算工具来说这个承诺很小,对它所在的大类来说却很大。这个大类迟早会装下一些人们不愿粘进网站的东西: 一份文档里的尺寸、一份体检报告上的数值、一份合同里的量。浏览器端这条规则从第一个工具就落地,是因为它 远比事后补上更容易坚持。
有两件事这一页确实管不了,但还是说清楚:浏览器对输入框内容的记忆,以及你按下复制按钮之后的剪贴板。 它们不在任何网页的能力范围里,包括这一页。
常见问题
- 这些换算系数是从哪来的?会过期吗?
- 来自定义,不是来自测量。1 英寸正好 25.4 毫米,是 1959 年国际码磅协定规定的;1 磅正好 0.45359237 千克,同一个协定;美制加仑自 1836 年起由法案定为 231 立方英寸;1 KiB 正好 1024 字节,由 IEC 80000-13 规定。定义不会变,所以这一页不存在「数据过期」这件事 —— 十年后再来算,同样的输入得到同样的结果。温度是唯一的例外:它不是比例关系,所以用一对写出偏移量的公式表示,而不是硬凑一个系数。
- 为什么 1 GB 换成 GiB 是 0.93132257?
- 因为 GB 与 GiB 是两个不同的单位。GB 用的是按 1000 进位的 SI 前缀,1 GB 正好 1,000,000,000 字节;GiB 用的是按 1024 进位的 IEC 二进制前缀,1 GiB 正好 1,073,741,824 字节。相除得 0.9313225746154785,按 8 位有效数字写出来就是 0.93132257。硬盘厂商报十进制(数字更大),操作系统多半报二进制 —— 这个工具把同一批字节的两种读数并排给出,不替你选一个。
- 为什么温度不能乘一个系数换算?
- 因为温度标度的零点是「选定」的,不是「找到」的。0 °C 是水的冰点,0 °F 是华氏当年挑的一盆盐水,两者都不是「没有热量」。只有开尔文和兰氏度从绝对零度开始,所以只有它们能像普通比例单位那样处理。摄氏度与华氏度因此按仿射关系算:一个刻度比加一个偏移量。你可以自己验证的后果是:冰点、沸点、−40 和绝对零度这四个物理锚点,换过去再换回来得到的是你输入的那个数,而不是「差了千万亿分之一」。
- 输入低于绝对零度的温度会怎样?
- 它会照算,然后把这件事说出来。输入 −300 °C 会得到 −26.85 K,并附一句「这个输入低于 −273.15 °C,也就是该标度的最低值」。另一种做法是悄悄把输入夹到绝对零度,那会给出一个看着合理的数字,同时把「你的输入本来就错了」这件事藏起来 —— 那正是这一页在防的失败方式。反过来也一样:超出浏览器表示范围的溢出值会被拒绝并说明原因,而不是在结果里印一个「Infinity」。
- 精度是怎么定的?为什么用有效数字而不是小数位?
- 因为同一页要横跨 1 纳米和 1 公里。固定小数位会毁掉小的一端,固定整数位会毁掉大的一端。有效数字与量级无关,所以档位按它给:4、6、8、10、12 位,默认 8 位。结果的整数部分永远不被截断 —— 1 GB 换算成字节写的是 1000000000,不是 1.0000000e+9;超过 1e16 或低于 1e-6 才改用科学计数法,因为一串 0 比一个指数更容易数错。另外每一步都会清理到 14 位有效数字(去掉 100000.00000000001 这类二进制噪声),而只要这一步真的改动了数值,机器算出的原始值就会和清理后的值一起列出来。
- 我输入的内容会被上传或保存吗?
- 不会。这一页只是一个静态文件,引用一份纯函数模块:换算、取整、单位清单、往返自检和提示全部在你已经打开的这个标签页里跑。不向我们的服务器发请求、不给你的内容挂统计事件、不写 cookie、不做任何存储 —— 刷新页面,你输入的东西就没了,因为它从来没有到过别的地方。也正因为不经过服务器,它不限次数。
这一页不打包任何换算表。上面每一个系数、每一份单位清单、每一个结果,都来自测试套件所跑的那同一份纯函数模块 —— 所以不可能出现"页面上是对的、测试里是错的"这种偏差。