单位换算与进制转换:因子、显示取整,和范围的两端
两台页面都叫「转换器」,但这个词把要紧的差别盖住了。单位换算页做的是浮点乘除:一张表里存着每个单位相对基准的大小,其中一部分是国际定义值,一部分是平均值,而它的输出是为阅读排版过的,不是为继续算准备的。进制转换页做的是另一件事——把同一个整数换个进制重新写一遍,全程用大整数,所以它的范围内不可能出错,唯一值得问的问题是范围到哪为止。
这个区别决定了你要防的东西不一样。单位换算要防的是约定和显示:哪一种加仑、哪一种吨、六位小数之外还剩多少。进制转换只需要记住 2⁵³−1 这条线,而且它是硬拒绝,不是四舍五入。
下面每一条都是从两台页面自己的脚本里读出来、再在页面上实际跑一遍确认过的。写出来的数字,就是页面实际显示的数字。
两台页面各自存了什么
单位换算页里有八类、共 77 个单位。每个单位就是一个数:它在所属类别里的基准单位下的倍数。
| 类别 | 单位数 | 基准单位 |
|---|---|---|
| 长度 | 16 | 米 |
| 重量 | 11 | 千克 |
| 温度 | 3 | —(见下) |
| 面积 | 11 | 平方米 |
| 体积 | 12 | 升 |
| 速度 | 6 | 米/秒 |
| 时间 | 9 | 秒 |
| 数据存储 | 9 | 字节 |
换算就是「数值 × 来源因子 ÷ 目标因子」一步算完,不经过任何中间实物单位,所以链条上不会累积误差——你用的那一个因子是多少,结果就是多少。
进制转换页没有表。它把你打的字解析成任意精度的整数,查一次上限,然后用另外三种进制重新写出来。
哪些因子是定义值,哪些是平均值
属于定义、可以当准数用的:
- 长度:1 英寸 = 0.0254 米、1 英尺 = 0.3048 米、1 码 = 0.9144 米、1 英里 = 1609.344 米
- 重量:1 磅 = 0.45359237 千克、1 盎司 = 0.0283495231 千克
- 速度与海里:1 海里 = 1852 米、1 节 = 0.5144444 米/秒、1 英里/时 = 0.44704 米/秒
- 市制单位按法定米制换算:1 里 = 500 米、1 丈 = 10/3 米、1 尺 = 1/3 米、1 寸 = 1/30 米、1 斤 = 0.5 千克、1 亩 ≈ 666.6667 平方米
属于约定或平均值的,也是不同工具给出不同数字的地方:
- 加仑、夸脱、品脱、液体盎司、杯、汤匙、茶匙都是美制液量单位。 1 加仑 = 3.785412 升、1 汤匙 = 0.0147868 升、1 茶匙 = 0.00492892 升。英制加仑(4.54609 升)不在表里。
- 「吨」是公吨(1000 千克)。美制短吨(907.18 千克)和英制长吨(1016.05 千克)都没有。
- 马赫取 343 米/秒。 这个值通常对应海平面、约 20 ℃ 的干空气;15 ℃ 时约为 340 米/秒,高空低温下还要低。所以马赫的读数只在这条假设下成立,航空场合请按当时的大气条件算。
- 「年」是 31536000 秒,也就是整 365 天;「月」是 30 天。 算费率够用,算日期会错:12 个月在这个页面里是 360 天,换算成「年」显示 0.986301;366 天显示 1.00274 年。
显示的窗口,和一条页面上没写的规则
结果框是只读的,里面的数按数量级分档:
| 数值 | 显示方式 |
|---|---|
| 0.001 到 100 万之间 | 最多六位小数,去掉尾随零 |
| 大于等于 100 万,或小于 0.001 | 科学计数法,保留四位小数 |
| 绝对值小于 1e-10 | 显示 0 |
| 非有限值 | 显示 — |
这张表里藏着两个细节。第一,上界是开区间,所以正好 100 万不会走普通数字:1 平方千米显示成 1.0000e+6 平方米、1 立方米显示成 1.0000e+6 毫升、1 千米显示成 1.0000e+6 毫米。第二,还有一条不在页面说明里的规则:即使落在窗口内,只要六位小数写出来超过 12 个字符,也会被换成科学计数法。「1 米 = 39.370079 英寸」是八个字符,保留;但下面这些都在窗口内,却都变成了科学计数法:
| 换算 | 精确结果 | 显示 |
|---|---|---|
| 7 千米 → 英寸 | 275590.55118110… | 2.7559e+5 |
| 1 尺 → 微米 | 333333.33333333… | 3.3333e+5 |
| 123456 英里 → 千米 | 198683.172864 | 1.9868e+5 |
| 1 磅 → 吨 | 0.00045359237 | 4.5359e-4 |
想要普通数字,就换一个让结果落回中间地带的目标单位。
取整只发生在显示层
因子在内部是全精度的,被四舍五入的只有你读到的那串字。1 磅按 0.45359237 换算,显示成 0.453592——六位小数;下面那行公式里的因子也是同一个被显示规则截过的数字,所以你复制得到的位数和你实际能用的位数是一致的。
由此有两件事值得记住。一是一次算完比手工分两步准,因为第二步是从一个已经掉过位数的数字出发的;二是本文里写的定义值就是页面用的定义值,需要六位以上有效数字时请直接用定义值算,别接着用屏幕上的结果。
数据存储:一路 1024,只有一行不合群
这一类全部按 1024 的幂计算,也就是操作系统统计容量时的口径:1 KB = 1024 B、1 TB = 1024 GB、1 字节 = 8 比特。那些看起来别扭的读数都来自显示窗口,不是因子:
- 1 吉字节 → 太字节 显示
9.7656e-4(低于 0.001,进科学计数法) - 1000 吉字节 → 太字节 显示
0.976563 - 1 太字节 → 字节 显示
1.0995e+12
但有一行是真的不一样。拍字节的因子存的是 1.1258999e15,而 2⁵⁰ 是 1125899906842624,两者差 6842624 字节,约 0.0006%。所以 1 拍字节换出来是 1023.999994 太字节,不是 1024。从字节到太字节这一段在 1024 口径里是自洽的;拍字节是个圆整过的近似值,如果你的计算要求严格的二进制倍数,第六位就会对不上。
温度是唯一没有因子的一类
摄氏、华氏、开尔文的零点不重合,一个乘数描述不了它们的关系。页面把每一种换算都先归到摄氏——华氏用 (℉ − 32) × 5/9,开尔文用 ℃ + 273.15——结果框下面那行显示的也是公式,而不是因子。
| 输入 | 结果 |
|---|---|
| 37 摄氏度 | 98.6 华氏度、310.15 开尔文 |
| 0 华氏度 | 255.372222 开尔文 |
| 0 开尔文 | −273.15 摄氏度、−459.67 华氏度 |
| 37 开尔文 | −236.15 摄氏度、−393.07 华氏度 |
来源和目标选同一个单位时,数值原样通过,公式行写「相同单位,值不变」,不会硬套一遍公式。
结果下面那行字在说什么
那行是因子读数,不是你这次计算的复述:它永远描述「1 个单位」。12 个月换算成天,结果框是 360,公式行写的是「1 月 = 30 天」。它还是按标签第一个左括号切出来的,所以「里 (市里)」显示成「里」,「英寸 (in)」显示成「英寸」。
因为它走同一套显示规则,这行字自己也会变成科学计数法:「1 寸 = 3.3333e-5 千米」「1 斤 = 5.0000e-4 吨」——数值没错,但看起来比实际精度低。
交换按钮与切类别:哪些东西会被保留
- 交换只把两个下拉框的值对调,输入的数字不动。2 千米 → 厘米 显示
200000;交换后同样那个 2 变成「2 厘米 → 千米」,显示2.0000e-5;再交换回来又是200000。不会漂移,因为每次计算都是从你的数字和因子重新乘除,不是拿屏幕上的比值继续算。 - 切类别会把两个下拉框重置成新类别的前两个单位,但保留你输入的数字。刚才那个代表「2 千米」的 2,切到温度就变成 2 摄氏度,显示 35.6 华氏度。每次切类别之后要重新确认单位,不能只看数字。
- 输入处理:输入框空着或填了非数字,按 0 处理,不报错;负数照算(−1 千米 →
-1000);填1e400这类溢出字面量,结果显示—。结果框不可编辑。
进制转换:范围内不可能出错,唯一的问题是范围在哪
解析和输出都走任意精度整数,数字全程不经过浮点数。也就是说这台页面在范围内不会失准,它只有可能拒绝你。
天花板是 9,007,199,254,740,991,也就是 2⁵³−1——双精度浮点数能连续精确表示的最后一个整数。这个上限在四种进制里的样子:
| 进制 | 值 |
|---|---|
| BIN | 1111111111111111…(共 53 个 1) |
| OCT | 377777777777777777 |
| DEC | 9,007,199,254,740,991 |
| HEX | 1FFFFFFFFFFFFF |
所以二进制最多 53 位,而 2⁵³(9007199254740992)会被直接拒收,不会四舍五入。判断是在精确整数上做的,所以你粘 200 位数字进去也是先完整解析、再整条驳回,不存在悄悄截断。
你正在打字的那个框保留原文
你编辑的那个框原样保留你的输入,另外三个框被改写成规范形式。两个后果:
- 前导零留在他打的那个框里。 在二进制框里打
00001010,该框仍是00001010,另外三框显示10(十进制)、12(八进制)、A(十六进制)。在十进制框里打007,框里仍是007,下方读数写7。被去掉前导零的是页面替你填的那三个框,不是你在用的那个。 - 十六进制的大小写在输入时也保留。 在十六进制框里打
abc,框里就是abc;由其它框推导出来的十六进制值则一律大写(FF、1FFFFFFFFFFFFF)。
三种失败,三种反应
| 你的操作 | 页面的反应 |
|---|---|
打了非法字符(0x1A、-1、1.5、1 255) |
该框标红,另外三框保留上一次的有效结果,下方读数也保留 |
| 数值超过 2⁵³−1 | 该框标红,另外三框被清空,下方读数换成红色的超出范围提示 |
| 把当前框清空 | 四个框一起清空,读数回到起始提示 |
这两类失败的区别是有意的:打到一半敲错一个字符,不该把你正要复制的结果一起毁掉;而超出范围的数旁边不能留着一个旧答案。
有一处毛刺:超范围一次之后,那个已经被标红的空框会在你转到别的框操作期间一直红着。你在它里面再输入一次、或者按「清空全部」,红色才会消掉。
按键、复制按钮与读数
- 在输入框里按 Esc 会清掉当前这一格,并连带重置另外三格。
- 清空全部按钮做同样的事,并且会把红色标记一并清掉。
- 每个框右侧各有独立的复制按钮,提示文字(已复制)约 1.2 秒后自动消失。
- 下方十进制读数用英文逗号分组,两种语言版本都一样(2,748、9,007,199,254,740,991),因为分组方式写死在代码里,不跟随系统语言。
- 空格:首尾空格会被去掉并按合法输入处理(
255当作 255);数字中间的空格不合法,1 255会被标红。
什么时候用哪一台
- 单位换算适合厨房、旅行、屏幕与纸张尺寸、土地面积、速率,以及任何以数据手册单位给出的量;数字要紧时,直接读本文的因子表。
- 不要拿它的「年」「月」做日期计算:365 天和 30 天都是平均值。真实日历请用日期计算器,闰日它也算。
- 进制转换适合位掩码、颜色码、文件头和内存地址。记住它按设计就是无符号整数:负数和(补码)小数都不在范围内。
- 需要六位以上有效数字时,请取本文给出的定义值一次算完,不要拿屏幕上的圆整结果继续往下算。
常见问题
为什么 1 平方千米显示成 1.0000e+6 平方米,而不是 1000000? 普通数字的窗口上界是开区间,正好 100 万已经属于科学计数法那一档,所以显示比直觉早四位切换。数值是对的,变的只是写法。
这个换算器一共多少个单位? 八类共 77 个:长度 16、重量 11、温度 3、面积 11、体积 12、速度 6、时间 9、数据存储 9。中英两版的数字完全相同,差别只在标签文字。
是哪一种加仑、哪一种吨、哪一种杯? 美制液量加仑(3.785412 升)、公吨(1000 千克)、美制杯(0.236588 升)、美制汤匙和茶匙。英制加仑、短吨、长吨、英制杯都没有。
这里 1 拍字节等于 1024 太字节吗? 不等——这是唯一一处跳出规律的读数:拍字节因子存的是圆整过的 1.1258999e15,而不是精确的 2⁵⁰,所以 1 拍字节显示 1023.999994 太字节。从字节到太字节这一段,1024 口径是精确成立的。
公式行为什么会变成 4.5359e-4? 那行和结果走同一套格式化规则。0.00045359237 小于 0.001,所以被显示成四位小数的科学计数法。
能把毫升换成克吗? 作为单位换算不行:那要跨类别,还要知道密度。水约 1 克/毫升,油、蜂蜜、面粉都不是,所以页面把体积和质量分开。
为什么上限是 9,007,199,254,740,991? 因为它是 2⁵³−1,双精度浮点数能精确表示的最后一个整数。再往上,相邻的整数可能共用同一个浮点值,页面选择拒收,而不是给你一个可能错的结果。
我在十六进制框里打了小写 abc,它为什么一直是小写? 你正在打字的框不会被页面改写——正因如此你才能连续编辑而文字不跳。页面替你算出来的十六进制值是大写的,你自己敲的保持原样。
进制转换能处理负数或小数吗? 不能。输入被当作该框进制下的一串数码,负号和小数点都会被判为非法字符并标红。需要带符号表示就先转绝对值、自己补符号;小数可以先放大成整数再转。