工程記數法將一個數表示為一個係數乘以十的冪,其指數僅限於三的倍數——0、±3、±6、±9,依此類推——這使得任何非零值在小數點前保留一、二或三位數字。這項單一限制正是區分工程記數法與一般科學記數法的關鍵:在科學記數法中,12345 會變成 1.2345 × 10⁴,指數為 4,但在工程記數法中,同一個數會變成 12.345 × 10³,因為指數必須降至下一個較低的三的倍數。因此,轉換規則很簡單:將任何以科學形式書寫的值,其指數向下取整至下一個較低的三的倍數,並將釋出的數字移回係數中。對於非常小的數字,規則反向適用:1 × 10⁻⁵ 向下取整為 10⁻⁶,得到 10 × 10⁻⁶,而不是 0.01 × 10⁻³。手動轉換時,最常見的差三錯誤來源,就是搞錯這個向下取整的方向。

how to convert scientific notation to engineering notation
如何將科學記數法轉換為工程記數法

工程記數法與科學記數法的差異

兩種記數法都將一個數寫成係數 × 10^指數 的形式。唯一的結構性差異在於套用於指數的規則。科學記數法要求小數點前恰好有一位非零數字,並允許指數為任意整數。工程記數法則要求指數為三的倍數,這使得非零值的係數在小數點前可延伸為一、二或三位數字。這樣的選擇並非隨意——正是它使工程記數法能與 SI 詞頭對齊。微 (10⁻⁶)、毫 (10⁻³)、千 (10³)、兆 (10⁶)、吉 (10⁹)、太 (10¹²) 都是指數為三的倍數的冪,因此已為工程形式的值可直接透過讀取指數來重新標上詞頭。一份規格書列出 4.7 × 10⁻⁶ 法拉,所記載的電容量與 4.7 µF 相同;後者便是以詞頭「微」取代指數的工程記數法。

特性科學記數法工程記數法
允許的指數任意整數僅限三的倍數
小數點前的位數恰好 1 位(非零)1、2 或 3 位(非零)
12,345 的範例1.2345 × 10⁴12.345 × 10³
0.000047 的範例4.7 × 10⁻⁵47 × 10⁻⁶
直接對齊 SI 詞頭間接直接

即使不使用詞頭,指數規則仍然重要。試算表、計算器和 IEEE 754 顯示器都能從固定寬度的係數中受益。物理實驗室、電子工作檯和計量報告一致偏愛工程形式,因為它所產生的係數最多僅三位數,長度夠短,可寫入表格欄位或列印於標籤上而不會破壞排版。NIST 的 Guide for the Use of the SI 將記數法與帶詞頭單位的對齊,視為工程形式在實驗室與工程領域受到偏好的原因。

將科學記數法轉換為工程記數法

開啟 科學記數法轉換器,並依照下列步驟操作:

  1. 在輸入框中輸入一個值。輸入一般小數,例如 12345、0.00123 或 .5,或貼上 e/E 科學記數值,例如 -4.2e-7。請使用小數點作為小數分隔符,不要加入逗號與單位,且最多包含一個可有可無的前置正負號。
  2. 選擇 Convert notation(轉換記數法)。轉換器會在瀏覽器中使用嚴格的語法解析輸入,該語法接受可有可無的正負號、含一個可有可無小數點的十進位數字,以及一個可有可無的有號整數指數。其他任何內容——逗號、空格、十六進位數字、重複的小數點或單獨的小數點——都會被拒絕。
  3. 讀取工程記數法那一列。三種輸出形式會同時出現:標準化科學記數形式、工程記數形式,以及完整的十進位值。工程記數那一列,就是指數結尾為三的倍數的那一列。
  4. 複製您所需的确切形式。每個輸出都有各自的複製按鈕,因此剪貼簿永遠不會拿到錯誤的格式。工程記數形式是規格書、詞頭標示或預期十的冪與 SI 對齊之程式碼的正確選擇。
  5. 注意明確的限制。原始輸入上限為 20,000 個 UTF-16 程式碼單位,係數上限為 10,000 位十進位數字,完整十進位輸出上限為 100,000 個程式碼單位。若結果超過任何一項預算,轉換器會回傳一個錯誤,而非部分或四捨五入後的值。

範例解析:12345 的三種形式

以整數 12345 為例。將其寫成標準化科學記數法時,小數點前會有一位非零數字:

12345 = 1.2345 × 10⁴,或以簡寫的 e 記數法寫成 1.2345e+4。

若要將其轉換為工程記數法,將指數 4 向下取整至下一個較低的三的倍數。下一個較低的倍數是 3,降一階。將一位數字從指數移回係數:

12345 = 12.345 × 10³,或 12.345e+3。

完整十進位形式就是 12345——不需要補零的小數部分。若要以手動方式驗證規則,可計算位數:係數 12.345 在小數點前有兩位數字(12),小數點後有三位數字(345),而指數 3 是三的倍數。同一個值通過轉換器後,工程記數那一列每次都會回傳 12.345e+3,因為此工具會將每個輸出再次送入其自身的標準化器,確認結果為規範形式後才顯示。作為比較,Python 的 Decimal.to_eng_string 基於相同理由採用相同的向下取整規則。

嚴格解析器接受的輸入格式

轉換器刻意拒絕任何含糊的內容,因此在貼上數值之前,值得先了解解析器所執行的确切語法。

  • 接受的正負號。前置 + 或 − 為可有可無。−0 與 +0 都會被接受,然後規範化為單純的 0。
  • 接受的係數結構。十進位數字,最多含一個小數點。當小數點後接有數字時,前置小數點是可接受的,因此 .5 是有效的。當數字後接小數點時,後置小數點也是可接受的,因此 123. 是有效的。兩側皆無數字的單獨小數點 . 則不被接受。
  • 接受的指數。一個可有可無的 e 或 E,後接一個有號整數。指數可以遠大於 JavaScript 的安全整數範圍,因為它在進行任何運算之前會以 BigInt 進行解析。
  • 空白字元。前置與後置空白會被去除;數字內部的空格則會被拒絕。

被拒絕的格式。千分位分隔符(1,000)、空格分隔符(1 000)、十六進位或其他進位前置詞、字串 Infinity 與 NaN、含兩個或以上小數點的係數、無數字的指數(1e),以及同時具有前置與後置小數點的係數,都會被解析器拒絕。當發生拒絕時,轉換器會顯示一個錯誤,且不會嘗試部分轉換。正是這種嚴格性,使其能保證每一位非零係數數字都被精確保留——請參閱 Wolfram MathWorld 關於科學記數法 中該嚴格語法所實作的慣例。

限制、邊界情況,以及零為何會被規範化

轉換器的輸出端由三項明確的預算所規範:原始輸入最多 20,000 個 UTF-16 程式碼單位,係數最多 10,000 位十進位數字,完整十進位輸出最多 100,000 個程式碼單位。這些上限皆不會靜默地四捨五入或截斷。若一項轉換所需的程式碼單位超出預算即使僅一個,整個轉換就會以一個明確的錯誤失敗——三段式輸出根本不會顯示,因此讀者無法將截斷後的結果誤認為規範值。

有兩個邊界情況值得注意,因為它們常使手動轉換出錯。首先,負指數與正指數的向下取整方式相同:1e-5 的指數向下取整為 -6(下一個較低的三的倍數),得到 10e-6,而不是 0.01e-3。正負號屬於數值本身,而不屬於指數,因此 -4.2e-7 的指數向下取整為 -9,結果為 -420e-9。其次,零沒有唯一的標準化指數,因此轉換器將每一個零——包括 -0、0.000 與 0e999999——規範化為單一形式 0e+0,十進位值為 0。前置零、後置零、輸入上的明確正號,以及零上的負號,皆被視為外觀而非語意,這代表同一個數值無論如何格式化,輸出都會相同。

即使大整數超過 Number.MAX_SAFE_INTEGER,仍會被精確保留。係數從不進入 JavaScript 的浮點 Number,因此 9007199254740993 可以往返轉換仍為 9007199254740993,在其工程記數形式中亦然。若需要將一個長數值與原始測量進行比對,可將其送入科學記數法轉換器,並將工程記數那一列與原始值進行比較。此轉換器是記數法工具,而非四捨五入或有效位數工具,因此當尾端零帶有精度意義時,請另外保留您的測量紀錄。

延伸閱讀:如何在科學計算機上計算立方根。