DOUBLE

64 位双精度浮点类型(DOUBLE)遵循 IEEE 754 标准,用于存储实数。可以表示非常大或非常小的数值,有效精度约为 15 到 17 位十进制数字。

语法

DOUBLE

值范围

  • 最大正值:约 1.7976931348623157 × 10³⁰⁸
  • 最小正值(非零):约 4.9 × 10⁻³²⁴
  • 字面量后缀:
    D
    D
    (如
    1D
    1D
    -6.5D
    -6.5D

示例

  1. 使用 DOUBLE 字面量后缀:

    SELECT +1D;

    返回:

    1
    1

  2. 将整数转换为 DOUBLE:

    SELECT CAST(-6 AS DOUBLE);

    返回:

    -6
    -6

  3. 科学计数法表示:

    SELECT 1.99714E+13;

    返回:

    19971400000000
    19971400000000

  4. 将字符串转换为 DOUBLE:

    SELECT CAST('123.456' AS DOUBLE);

    返回:

    123.456
    123.456

  5. 两个 DOUBLE 值相加:

    SELECT CAST(123.456 AS DOUBLE) + CAST(678.91 AS DOUBLE);

    返回:

    802.366
    802.366

  6. 比较两个 DOUBLE 值:

    SELECT CAST(123.456 AS DOUBLE) > CAST(122.345 AS DOUBLE);

    返回:

    true
    true

  7. 计算平方根:

    SELECT SQRT(CAST(16 AS DOUBLE));

    返回:

    4
    4

  8. NULL 值处理:

    SELECT CAST(NULL AS DOUBLE);

    返回:

    NULL
    NULL

  9. 精度损失示例(DOUBLE 与 DECIMAL 的差异):

    SELECT CAST(0.1 AS DOUBLE) + CAST(0.2 AS DOUBLE);

    返回:

    0.30000000000000004
    0.30000000000000004
    (存在浮点精度误差)

    对比使用 DECIMAL:

    SELECT CAST(0.1 AS DECIMAL(10,1)) + CAST(0.2 AS DECIMAL(10,1));

    返回:

    0.3
    0.3
    (精确计算)

选型建议

场景推荐类型原因
金融金额、精确计算
DECIMAL
DECIMAL
精确小数,无浮点误差
科学计算、统计分析
DOUBLE
DOUBLE
精度高(15-17位),范围大
向量/ML 特征值
FLOAT
FLOAT
精度够用,存储节省一半
需要与 FLOAT 互操作
DOUBLE
DOUBLE
隐式提升,不丢精度

DOUBLE 与 FLOAT 的精度对比(实测):

SELECT CAST(3.14159265358979 AS FLOAT) AS f, -- 3.1415927410125732(7位后失真) CAST(3.14159265358979 AS DOUBLE) AS d; -- 3.14159265358979(完整保留)

注意事项

  • DOUBLE 是近似数值类型,不适合用于需要精确计算的场景(如金融金额)。精确计算请使用
    DECIMAL
    DECIMAL
    类型。
  • 浮点数的比较可能因精度误差产生意外结果,避免直接用
    =
    =
    比较两个 DOUBLE 值。
  • 算术溢出(超出约 ±1.8×10³⁰⁸)返回
    Infinity
    Infinity
    -Infinity
    -Infinity
    sqrt(-1)
    sqrt(-1)
    等无效运算返回
    NaN
    NaN
  • 除以零(
    0.0/0.0
    0.0/0.0
    1.0/0.0
    1.0/0.0
    )在 Lakehouse 宽松模式下返回
    NULL
    NULL
    ,不返回
    Infinity
    Infinity
    NaN
    NaN
    。建议用
    NULLIF(denominator, 0)
    NULLIF(denominator, 0)
    显式处理,使意图更清晰:
    numerator / NULLIF(denominator, 0)
    numerator / NULLIF(denominator, 0)
  • CAST 转换失败时返回 NULL。
联系我们
预约咨询
微信咨询
电话咨询