將十進位數字轉換為 IEEE 754 浮點數格式,代表將該數值表示為一個 1 位元的符號位元、一個偏置指數欄位,以及一個分數欄位,並打包成固定寬度的 32 位元或 64 位元的字組。32 位元的形式稱為 binary32(單精度),而 64 位元的形式稱為 binary64(雙精度)。這兩種配置皆遵循 IEEE 754 標準的二元浮點運算,是所有現代 CPU、GPU 與網頁瀏覽器用於 float 與 double 數值的格式。此轉換是完全確定性的:對於你輸入的任何十進位數值,在你所選擇的格式中只有唯一一個 IEEE 754 位元樣式,而且該樣式可以被解碼回瀏覽器實際儲存的相同數值。若想在不手動撰寫解析程式碼的情況下檢查該樣式,你可以使用 IEEE 754 浮點數轉換器,它能將十進位數字編碼為 binary32 或 binary64 欄位,並將位元或十六進位表示法解碼回瀏覽器中的數字,整個過程都透過瀏覽器的 DataView API 完成。每一步都在本機執行,因此瀏覽器為你的數值所保存的確切位元組皆可一覽無遺,不會有近似值。

IEEE 754 binary32 與 binary64 的位元配置
無論是單精度或雙精度,每個 IEEE 754 二元浮點數值皆由相同的三個部分構成:一個符號位元、一個帶有固定偏置值的指數欄位,以及一個儲存小數點後位元的分數欄位(亦稱為尾數或有效位數)。兩種格式的欄位寬度不同,但配置文法完全相同,這也是為何同一套轉換邏輯可同時處理兩者的原因。
| 欄位 | Binary32(單精度) | Binary64(雙精度) |
|---|---|---|
| 總位元數 | 32 | 64 |
| 符號位元 | 1 | 1 |
| 指數位元 | 8 | 11 |
| 分數位元 | 23 | 52 |
| 指數偏置值 | 127 | 1023 |
| 指數範圍(未偏置,常規數) | -126 到 +127 | -1022 到 +1023 |
| 最小正次常規數 | 2^-149 | 2^-1074 |
| 交換格式中的十六進位位數 | 8 | 16 |
指數以偏置形式儲存,表示真實指數加上偏置值後才會出現在位元中。對於常規數,未偏置指數等於儲存指數減去偏置值(binary32 為 127,binary64 為 1023)。對於次常規數,未偏置指數為一減去偏置值,因此公式會平移一位。符號位元在非負值時為 0,負值時為 1;正零與負零的指數欄位皆為全零,分數欄位亦為全零,兩者之間僅差符號位元。這些格式的十六進位輸出會以最高有效位元組優先顯示,binary32 使用恰好八位十六進位數字,binary64 則使用恰好十六位,當你複製到其他工具或檔案中使用時不會帶有 0x 前綴。
為何 binary32 會改變你的十進位數值
當你在轉換器中輸入像 0.1 或 1234567 這類十進位數字並選擇 binary32 時,結果很少會是你輸入的確切十進位數字,而這種落差並不是錯誤。JavaScript 首先會將該十進位數字解析為雙精度 Number,然後 DataView 會將該 double 四捨五入至最接近的可表示 binary32 值。你在輸出中看到的「儲存值」是四捨五入後的單精度結果,而非原本輸入的十進位字串。對於 binary64,儲存值反映的是瀏覽器的雙精度交換值,而非原始的十進位字串,因此像 0.1 這類數值在套用最接近的可表示四捨五入後,仍然會與輸入值有所差異。
這代表轉換為 IEEE 754 永遠是從你的十進位數字投影到所選格式中最接近的可表示二元浮點數值。IEEE 754 浮點數轉換器透過以大端位元組順序讀取 DataView.getFloat32 或 DataView.getFloat64 的位元樣式來呈現這個結果,因此你所看見的位元正是瀏覽器將會儲存的位元,並非工具手動計算出的近似值。如果你需要保留確切的十進位字串,請改用十進位或任意精度函式庫:IEEE 754 無法精確表示大多數十進位分數,因為其二進位展開是無限的。請將轉換器回報的儲存值視為實際的數值量,而非你輸入的十進位數字。
將十進位數字轉換為 IEEE 754 格式
此轉換器圍繞著兩個相反方向建構:十進位到位元,以及位元或十六進位到十進位。十進位到位元的路徑是多數讀者來此的目的,以下步驟將逐步說明該流程以及結果中應檢視的內容。
- 開啟 IEEE 754 浮點數轉換器並選擇十進位到位元的方向,然後從格式選擇器中挑選 binary32(單精度)或 binary64(雙精度)。
- 以一般十進位記法輸入單一十進位數值,可選擇性地加上正負號、小數部分與十進位指數。輸入也接受特殊代字 Infinity、-Infinity 與 NaN。將欄位留空即可清除:空白輸入會被拒絕,而不會被視為零。
- 點擊轉換。工具會以大端位元組順序透過 DataView.setFloat32 或 DataView.setFloat64 寫入你的數值,接著讀回儲存的數字並呈現完整的分解結果。
- 檢視符號、指數、分數、分類、儲存值,以及依標準欄位寬度切分的二進位位元字串(binary32 為 1 + 8 + 23,binary64 為 1 + 11 + 52)。
- 複製十六進位交換格式(binary32 為八位十六進位數字,binary64 為十六位,無 0x 前綴),並對照將取用它的通訊協定、檔案格式或硬體所預期的位元組順序與精度進行驗證。
十六進位數值字面量、以逗號分隔的數字、單位以及特定區域的十進位分隔符號會在輸入時被拒絕。這種明確的拒絕至關重要,因為它能避免 JavaScript 的隱式強制轉換將解析錯誤隱藏在看似合理的位元樣式背後。例如,輸入的「1,000」不會被悄悄轉為一千;它會被拒絕,以便你將其修正為「1000」或「1.0e3」後再試一次。
轉換後如何讀取解碼後的欄位
完成轉換後,有四個欄位能最有效地揭示這些位元的實際意義。符號是單一的 0 或 1。指數是直接從位元樣式取出的原始偏置值;對於常規 binary32 數值減去 127,對於常規 binary64 數值減去 1023,即可得到未偏置指數;若是次常規數則使用一減去偏置值。分數欄位是附加隱含的前導 1 之後的原始位元,因此對於常規值,有效位數在二進位中表示為 1.分數。分類行則會告訴你指數與分數樣式所屬的類別。
作為一個實際參考,十進位數值 1.0 在 binary32 中的分解為:符號 0、偏置指數 127(二進位 01111111)、分數 0、分類為常規、儲存值 1、十六進位 3F800000。位元字串 0 01111111 00000000000000000000000 讀作「正數,指數欄位為 127,未設置分數位元」,這是數字 1 的標準單精度編碼。同一數值在 binary64 中則為:符號 0、偏置指數 1023、分數 0、儲存值 1、十六進位 3FF0000000000000。這些都是轉換器測試集中的參考測項,因此在使用更棘手的輸入之前,它們是確認工具運作正確的良好測試值。
IEEE 754 精度何時重要、何時不重要
即使工具運作完美,仍有兩種情況會使十進位到 IEEE 754 的轉換產生損失。第一種是其二進位展開為無限的十進位分數:0.1、0.2、0.3,以及幾乎所有不是 2 的冪次和的數值,都會四捨五入至最接近的可表示二元值。轉換器回報的是四捨五入後的儲存值,而非原始十進位數字,而這正是你在與瀏覽器實際行為比較時所需要的資訊。第二種情況是大整數:binary64 僅能精確表示至 2^53 的整數,而 binary32 更早便放棄,約在 2^24 左右,因為僅有 24 位元的有效位數可供使用。
| 指數樣式 | 分數樣式 | 分類 |
|---|---|---|
| 全零 | 全零 | 零(符號決定 +0 或 -0) |
| 全零 | 非零 | 次常規數 |
| 全一 | 全零 | 無限大(符號決定 +∞ 或 -∞) |
| 全一 | 非零 | NaN |
| 其他 | 任意 | 常規數 |
對於金額、識別碼、必須精確往返的計數器,或任何遺漏一個單位都會造成影響的領域,請勿依賴 IEEE 754:請使用十進位函式庫或整數表示法。對於繪圖、訊號處理、科學模擬,以及已強制規定使用 IEEE 754 的通訊協定標頭,轉換器是驗證你即將送出的位元組是否符合接收端預期的正確工具。基底轉換搭配指南涵蓋了反向情境——從位元出發並希望以其他基底讀取,而 IEEE 754-2019 標準則是本文所用之每個欄位寬度、偏置值與分類規則的權威來源。