进制与单位换算:唯一非线性的是温度
2 到 36 任意进制互转要用 BigInt 兜住精度;十类单位换算中前九类是线性比例,唯独温度是仿射变换,写成一个倍率就一定会错。
进制转换要先决定精度策略
2 到 36 进制互转在 10 之后用字母表示,解析规则本身很直接。真正的问题是 JavaScript 的 Number 是双精度浮点,超过 2 的 53 次方之后整数的低位会静默丢失。转换一个大整数而结果默默少了几位,是比报错更糟的情况。
所以整数部分走 BigInt:先按进制解析成任意精度整数,再输出目标进制。小数部分则明确告知会损失精度——二进制与十进制之间的小数本来就不总能精确互转,与其假装准确,不如说清楚。
二进制需要分组才有用
一长串 0101 是没法读的,必须分组。按 4 位一组正好对齐一个十六进制位,按 8 位一组则对齐字节。字节视图会按字节切分并同时给出十进制与十六进制,调试协议字段时比整串数字有用得多。
十类单位里九类是同一种
长度、重量、面积、体积、数据、时间、速度、压力、能量都是线性换算:彼此之间只差一个固定倍率,所以有一种实现方式——把每个单位折算成基准单位,再换算出去。数据单位要同时给出十进制与二进制两套(KB 与 KiB),否则「1 MB 是 1000 KB 还是 1024 KB」这个争论会一直跟着你。
温度是唯一的例外,它是仿射变换:摄氏与华氏之间既有比例也有偏移。用同一个「倍率表」结构去装温度,转换结果必然错误,而且错误只在非零值上显现——0 度看起来是对的。
一次列出全部
换算工具的价值在于不用逐次输入。输入一个数值,把该类别下所有单位的等价量一次列出,省掉「先换成基准单位、再换成目标单位」这两步。这也是我把十类放在同一个页面而不是拆成十个工具的原因。
自检覆盖
这类纯函数的边界特别适合断言:0 度摄氏等于 32 度华氏(能同时验证偏移与比例)、大整数进制往返必须一致、单位换过去再换回来必须回到原值。

评论
…