同一個名字,底下掛著兩套係數
食譜裡的「add 1 gal」、規格表上的「110 hp」、血壓計上的 mmHg、新硬碟拆封少掉的那截容量,麻煩都不在乘法,而在「這個名字是哪一個定義」:係數是確定的,出錯的是人選錯了係數。範本 unit-convert.html 是 12037 位元組、227 列,執行時 10 個類別、110 個單位(長度 15、重量 14、面積 14、體積 14、溫度 4、速度 8、時間 12、資料儲存 11、壓力 10、功率 8),下面四組就在同一類別裡並排。
| 量名 | 兩種寫法與係數 | 實測尾差 |
|---|---|---|
| 體積·加侖 | gal 3.785411784 / gal(UK) 4.54609 | 折成公升差 0.7606782160000005 |
| 功率·馬力 | hp 745.6998715823 / PS 735.49875 | 折成瓦差 10.201121582300061,大 1.3870%、小 1.3680% |
| 壓力·汞柱 | mmHg 133.322387415 / Torr 133.322368421 | 760 高度差 0.000014435440007787292 kPa |
| 儲存·位元組 | KB 1000 / KiB 1024 | MB 與 MiB 差 48576 B |
加侖差兩成,馬力差到小數點後第五位
加侖那兩列不只是顯示值不同:以美制為來源時 立方英寸 恰好是 231、加侖(英) 列 0.83267418,以英制為來源時 加侖(美) 顯示 1.2009499。英制比美制大 20.0950%、美制比英制小 16.7326%,只說「約 20%」會漏掉基準,單位換算工具 也不替你判斷食譜裡那個 gal 屬於哪一種,它只把兩邊同螢幕擺出來。
另外兩條更細:1 hp 折成 英尺磅每秒 顯示 550、原始值卻是 550.0000000127599,恆等式並不恰好成立;mmHg 與 Torr 那 0.000014435440007787292 kPa 來自截斷——101325 ÷ 760 = 133.32236842105263,程式碼存成 133.322368421,誤差 -5.263700586510822e-11 帕。這一對與其算兩種定義,不如算一種定義、兩種近似。
圖 1|三對同名單位在範本函式裡的實測顯示值。長條只在同對內按較大值等比,跨對不可比;最後一對差在第 6 位,已經分不出長短。
位元組的兩套進位:差從 48576 長到 99511627776
資料儲存類 11 個單位裡,KB 的 1000 與 KiB 的 1024 同時存在。1 MiB 折位元組 1,048,576、折 MB 顯示 1.048576;1 MB 折位元組 1,000,000、折 MiB 0.95367432。差從 MB 一檔的 48576 位元組(比值 1.048576)長到 GB 一檔的 73741824(1.073742)、TB 一檔的 99511627776(1.099512),1 TiB 折位元組直接顯示 1.099512e+12。
這是進位基數之爭,跟 2、8、16 那種進制是兩件事(要看同一個數換進制的樣子得用進制轉換),也不等於編碼位元組數(那歸字數與位元組統計)。文案裡那句「儲存容量與網速的 KB/KiB、Mbps 與 MB/s」得改口:這一類全是純量,範本裡 Mbps 與 MB/s 各出現 0 次。
溫度不走係數
溫度類 4 列沒有係數欄,公式列固定寫著華氏 = 攝氏 × 9 ÷ 5 + 32、克耳文 = 攝氏 + 273.15,所以 -40 ℃ 折成華氏還是 -40,同一列還給 K 233.15、°R 419.67,0 ℃ 折出 32、273.15、491.67。第 4 個單位的介面名稱是「華氏溫標(絕對)」、符號 °R,就是文案裡的蘭金,介面從不出現那兩個字。
結果保留幾位:那句「8 位有效」只對 13 個數量級成立
常見問題寫著「統一保留 8 位有效數字」,得按程式碼改口徑:dp 取 7 減 log10 的整數部分再夾進 0 到 12。同一串 1.23456789012345 挪數量級實測,恰好 8 個數字只有 k 從 -5 到 7 這 13 檔;k = -6 只剩 7 位,k = 8 給 123,456,789 變 9 位,k = 11 給 123,456,789,012 共 12 位。
圖 2|同一串 1.23456789012345 在不同數量級下經格式化函式得到的顯示與數字個數,長條按位數等比。
科學記號的門檻也不嚴:判據是絕對值大於等於 1e12(含等於),1e12 自己就輸出 1e+12,而 999999999999.9999 打滿 1,000,000,000,000 共 13 位;下限才是小於 1e-6。千分位只加在小數分支,8e11 顯示 800,000,000,000 而 8e12 顯示 8e+12。11 列或 15 列同螢幕一次鋪開才有意義,省掉的只是「漏看另一列」。
複製、反算,與那張倒置的畝分表
複製與反算拿到的精度不同源:逐條複製是顯示字串(KB 列 1,048.576、TiB 列 9.536743e-7,還帶逗號),反算讀的是 data-val 再 toPrecision(12) 寫回輸入框——1 畝 折平方公尺顯示 666.66667、原始值 666.6666666666666,反算後輸入變成 666.666666667,再折回 畝 是 1,真值 1.0000000000005 被抹平。來源單位那列沒有反算按鈕,長度 15 列只有 14 列帶。
面積類裡 畝 折平方公尺 666.66667、坪(400 / 121)3.3057851、1 公頃 折畝恰好 15、折坪 3,025 都站得住;出問題的是 分,程式碼存成 20000 / 3(範本列 57)、折平方公尺 6,666.6667,於是 1 畝 到 分 顯示 0.1、1 分 到 畝 顯示 10(原始值 10.000000000000002)。通行定義是 1 畝 = 10 分,這裡倒了 100 倍。
Q:為什麼 -40 攝氏度讀出來還是 -40?
偏移公式在這點自交,兩個方向都精確落回 -40,是兩種溫標唯一的重合點,不是捨入出來的。
Q:為什麼 1 MB 有時是 1048576 位元組?
那是 MiB 的值:1 MiB 折位元組 1,048,576、1 MB 折位元組 1,000,000,差 48576。名字裡有沒有 i 就是分水嶺。
Q:大數為什麼變成 e 寫法,能關掉嗎?
絕對值達到 1e12 或小於 1e-6 就切科學記號固定 7 位,程式碼裡沒有開關。先乘後除還會把中間量當上限:極端輸入 1e308 配 km 時 15 列全成破折號,真值本可表示的 5 列也一起丟了;空輸入、abc、1e400 直接落回「請輸入需要換算的數值」。