DECFLOAT 類型

適用於:勾選標記為是 Databricks SQL 勾選為 Databricks 執行時間 19 及以上

代表16或34位有效位的10進位浮點數,且無固定刻度。

Important

DECFLOAT 目前仍處於 測試階段。 工作區管理員必須在預覽中啟用 DECFLOAT 資料型別。

語法

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 保持輸入精度。
  • SQRT ABS, , 直接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)是不支援的。