適用於:
Databricks SQL
執行時間 19 及以上
代表16或34位有效位的10進位浮點數,且無固定刻度。
語法
DECFLOAT [ ( p ) ]
-
p: 最大有效十進位數。 支援的數值為16和34。 預設是34。
DECFLOAT 不接受尺度論證。 每個數值都有自己的指數。
Limits
| Property | DECFLOAT(16) |
DECFLOAT(34) |
|---|---|---|
| 有效數字 | 最多16人 | 最多34人 |
| 最小的正非零值 | 1E-398 |
1E-6176 |
| 最大正有限值 | (10^16 - 1) × 10^369 |
(10^34 - 1) × 10^6111 |
負數也適用相同的限制。 這兩種類型也都支援無限大和NaN。
Literals
使用 CAST 字串或支援的數值。 字串也可以包含 NaN、 Inf、 或 Infinity。
Notes
DECFLOAT代表小數值,例如 。0.1 超過精度的數值可以無誤地四捨五入,包括 。TRY_CAST 直接鑄造小數進位文字。 轉換過程中FLOATDOUBLE可能會失去精確度。
字串輸出會保留尾隨零點,因此相等值 1.5 如 和 1.50 可以產生不同的字串(+15E-1+150E-2和 )。 從 DECFLOAT 鑄造到 DECIMAL 四捨五入的 ,獨立於 DECFLOAT_ROUNDING_MODE。
- 當兩個運算元具有相同的 DECFLOAT 類型時,算術能保持精確度。 混合精度或與其他支援數字類型的運算會使用
DECFLOAT(34)。 -
SUM並AVG返回DECFLOAT(34)。MIN並MAX保持輸入精度。 -
SQRTABS, , 直接ROUND接受 DECFLOAT。
DECFLOAT_ROUNDING_MODE控制投擲的四捨五入,為 DECFLOAT、 +、 -、 /SUM*SQRTAVG和 。 預設值為 ROUND_HALF_EVEN。 其他支援的模式包括 ROUND_HALF_UP、 ROUND_CEILING、 ROUND_FLOORROUND_DOWN和 。
DIV移除結果的分數部分,不論 。DECFLOAT_ROUNDING_MODE
ROUND, BROUND, , TRUNCATE 並使用各自的四捨五入規則。
> SET DECFLOAT_ROUNDING_MODE = ROUND_FLOOR;
> SELECT CURRENT_DECFLOAT_ROUNDING_MODE();
ROUND_FLOOR
預設的四捨五入模式中,溢位產生無限大,除以零則產生無限大或 NaN。
ANSI 模式 不會改變這些結果。 支持 TRY_* 的算術函數會保持無限大和 NaN,而不是返回 NULL。 NaN 比較相等,並依正無限大排序。 正零和負零是相等的。 用 ISNAN 來偵測NaN。
Examples
> SELECT CAST('1.5' AS DECFLOAT(34)) + CAST('2.5' AS DECFLOAT(34)) AS total;
+40E-1
> SELECT CAST(CAST('1.23E+100' AS DECFLOAT(34)) AS STRING);
+123E+98
> SELECT typeof(CAST('1' AS DECFLOAT(16)) + 1);
decfloat(34)
局限性
- 其餘與位元運算不支援。
- 需要
DOUBLE輸入的函式不直接接受 DECFLOAT。 將數值DOUBLE轉換為 first(這可能導致精度損失)。 - DECFLOAT 與刪除向量不相容。 建立帶有 DECFLOAT 欄位的 Delta 表格時,請設定
TBLPROPERTIES ('delta.enableDeletionVectors' = 'false')。 對於現有資料表,在新增 DECFLOAT 欄位前, 先移除刪除向量資料表功能 。 - 包含 DECFLOAT 的 delta 表格不能啟用 Iceberg 讀取 。
- 不支援直接將 DECFLOAT 值寫入 Parquet 檔案。
- DECFLOAT 欄位沒有針對資料跳躍的最小/最大統計。 它們不能是分割欄、群集鍵、Z 階欄或 Bloom 濾波器索引欄。
- 在 和
DECFLOAT(34)ALTER COLUMN之間改變欄位DECFLOAT(16)是不支援的。