适用于:
Databricks SQL
运行时 19 及以上
表示10进制浮点数,具有16或34位有效位,且无固定刻度。
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保持输入精度。 -
SQRTABS, , 直接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。 将数值转换为 1DOUBLE(这可能导致精度损失)。 - DECFLOAT与删除向量不兼容。 在创建带有DECFLOAT列的Delta表时,将 设
TBLPROPERTIES ('delta.enableDeletionVectors' = 'false')为 。 对于已有的表,在添加 DECFLOAT 列之前, 先去掉删除向量表功能 。 - 包含 DECFLOAT 的 Delta 表不能启用 Iceberg 读取 。
- 不支持直接将 DECFLOAT 值写入 Parquet 文件。
- DECFLOAT列没有针对跳跃数据的最小/最大统计数据。 它们不能是分区列、聚类键、Z 阶列或布隆过滤器索引列。
- 在 和
DECFLOAT(34)ALTER COLUMN之间切换列DECFLOAT(16)是不支持的。