DECFLOAT 类型

适用于:勾选标记为是 Databricks SQL 勾选为 Databricks 运行时 19 及以上

表示10进制浮点数,具有16或34位有效位,且无固定刻度。

Important

DECFLOAT 处于 Beta 版。 工作区管理员必须在预览中启用 DECFLOAT 数据类型。

Syntax

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返回AVGDECFLOAT(34)。 MIN 并 MAX 保持输入精度。
  • SQRT ABS, , 直接ROUND接受 DECFLOAT。

DECFLOAT_ROUNDING_MODE控制投掷的四舍五入,进行DECFLOAT,+、*AVG-/SQRTSUM和。 默认值为 ROUND_HALF_EVEN。 其他支持的模式有 ROUND_HALF_UP、 ROUND_CEILING、 ROUND_FLOOR和 ROUND_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。 将数值转换为 1 DOUBLE (这可能导致精度损失)。
  • DECFLOAT与删除向量不兼容。 在创建带有DECFLOAT列的Delta表时,将 设 TBLPROPERTIES ('delta.enableDeletionVectors' = 'false')为 。 对于已有的表,在添加 DECFLOAT 列之前, 先去掉删除向量表功能 。
  • 包含 DECFLOAT 的 Delta 表不能启用 Iceberg 读取 。
  • 不支持直接将 DECFLOAT 值写入 Parquet 文件。
  • DECFLOAT列没有针对跳跃数据的最小/最大统计数据。 它们不能是分区列、聚类键、Z 阶列或布隆过滤器索引列。
  • 在 和 DECFLOAT(34)ALTER COLUMN 之间切换列DECFLOAT(16)是不支持的。