| 型別 | 用途 | 儲存格式 | 運算引擎 | 溢位行為 | 精度範圍 |
|---|---|---|---|---|---|
| NUMBER(p,s) | 資料欄、精確數值、浮點 | 十進制可變長 (1~22 bytes) | 軟體模擬 (轉二進制運算) | 不溢位,四捨五入/報錯依規則 | 1.0E-130 ~ 9.99E125 (38 位有效數字) |
| BINARY_INTEGER | PL/SQL 整數變數、迴圈計數 | 二進制補碼 (固定 4 bytes) | 軟體模擬 | **自動轉 NUMBER,不報錯** | -2^31 ~ 2^31-1 |
| PLS_INTEGER | PL/SQL 高效整數變數 | 二進制補碼 (固定 4 bytes) | **硬體原生 (CPU 整數指令)** | **溢位報錯 (ORA-01426)** | -2^31 ~ 2^31-1 |
NUMBER(p,s)
p = precision (有效數字總位數,1~38)
s = scale (小數點右邊位數,-84~127)
| 情境 | 規則 | 結果 |
|---|---|---|
| s > 0 (小數位) | 整數部位長度 > p-s → **ERROR** 小數部位長度 > s → **ROUND** | NUMBER(6,2) 存 12345.12 → ERROR (整數 5 位 > 4)存 1234.9876 → 1234.99 |
| s < 0 (捨入到小數點左) | 對小數點左 |s| 位進行四捨五入 | NUMBER(5,-2) 存 12345.58 → 12300 |
| s > p | 小數點後第 s 位向左最多 p 位數字,超過 → ERROR;向右捨入 | NUMBER(4,5) 存 0.0123456 → 0.01235存 0.1 → ERROR |
| 輸入值 | 型別定義 | 儲存結果 | 說明 |
|---|---|---|---|
| 123.2564 | NUMBER | 123.2564 | 無限制 |
| 1234.9876 | NUMBER(6,2) | 1234.99 | 精確到分 |
| 12345.12345 | NUMBER(6,2) | ERROR | 整數部位 5 位 + 小數 2 位 > 精度 6 |
| 1234.9876 | NUMBER(6) | 1235 | 等同 NUMBER(6,0) |
| 12345.345 | NUMBER(5,-2) | 12300 | 百位四捨五入 |
| 12345678 | NUMBER(5,-2) | ERROR | 8-2=6 > 5 |
| 123456789 | NUMBER(5,-4) | 123460000 | 萬位四捨五入 |
| 0.1 | NUMBER(4,5) | ERROR | 小數點後第 5 位向左需 1 位整數,但 0.1 整數部位為 0 |
| 0.01234567 | NUMBER(4,5) | 0.01235 | 符合規則 |
NUMBER(p,s):定點數,精度 p、刻度 s。NUMBER(p):整數,等同 NUMBER(p,0)。NUMBER:浮點數,精度 38,**刻度不固定**(非 s=0),可表示任意精度範圍內的值。BINARY_DOUBLE/BINARY_FLOAT (IEEE 754) 或 PLS_INTEGER。NUMBER(10,2) := 12345678.901 → 自動四捨五入為 12345678.90,無警告。NUMBER(5,-2) 不是「小數點左 2 位」,而是「捨入到百位」。NUMBER 或分批。ID NUMBER 允許任意精度,建議明確 NUMBER(18) 或 NUMBER(38) 便於 ORM 映射。Oracle 數字型體系:**NUMBER 為精確數值基石(金融級)、PLS_INTEGER 為高效整數引擎(PL/SQL 核心)、BINARY_INTEGER 為相容遺產**。掌握 p,s 精度規則、溢位行為差異、硬體 vs 軟體運算效能,並遵循「財務用 NUMBER、迴圈用 PLS_INTEGER、科學用 BINARY_DOUBLE」選型原則,即能寫出精確、高效、無驚喜的數值處理代碼。