跳转到主要内容
如果你需要精确计算,尤其是在处理需要高精度的金融或业务数据时,建议改用 Decimal如下所示,浮点数 可能会导致结果不准确:
CREATE TABLE IF NOT EXISTS float_vs_decimal
(
   my_float Float64,
   my_decimal Decimal64(3)
)
ENGINE=MergeTree
ORDER BY tuple();

# 生成 1 000 000 个保留 2 位小数的随机数,并分别以 floatdecimal 形式存储
INSERT INTO float_vs_decimal SELECT round(randCanonical(), 3) AS res, res FROM system.numbers LIMIT 1000000;
SELECT sum(my_float), sum(my_decimal) FROM float_vs_decimal;

┌──────sum(my_float)─┬─sum(my_decimal)─┐
499693.60500000004499693.605
└────────────────────┴─────────────────┘

SELECT sumKahan(my_float), sumKahan(my_decimal) FROM float_vs_decimal;

┌─sumKahan(my_float)─┬─sumKahan(my_decimal)─┐
499693.605499693.605
└────────────────────┴──────────────────────┘
下面列出了 ClickHouse 和 C 中对应的类型:
  • Float32float.
  • Float64double.
ClickHouse 中的 Float 类型有以下别名:
  • Float32FLOAT, REAL, SINGLE.
  • Float64DOUBLE, DOUBLE PRECISION.
创建表时,可以为浮点数指定数值参数 (例如 FLOAT(12)FLOAT(15, 22)DOUBLE(12)DOUBLE(4, 18)) ,但 ClickHouse 会忽略这些参数。

使用浮点数

  • 浮点数运算可能会产生舍入误差。
SELECT 1 - 0.9

┌───────minus(1, 0.9)─┐
0.09999999999999998
└─────────────────────┘
  • 计算结果取决于计算方式 (即计算机系统的处理器类型和架构) 。
  • 浮点计算可能会产生无穷大 (Inf) 和“非数” (NaN) 之类的数值。处理计算结果时应考虑到这一点。
  • 从文本中解析浮点数时,结果可能不是机器可表示的最接近值。

NaN 和 Inf

不同于标准 SQL,ClickHouse 支持以下几类浮点数:
  • Inf – 无穷大。
SELECT 0.5 / 0

┌─divide(0.5, 0)─┐
│            inf │
└────────────────┘
  • -Inf — 负无穷大。
SELECT -0.5 / 0

┌─divide(-0.5, 0)─┐
-inf │
└─────────────────┘
  • NaN — 非数值。
SELECT 0 / 0

┌─divide(0, 0)─┐
│          nan │
└──────────────┘
有关 NaN 排序规则,请参见ORDER BY 子句一节。

BFloat16

BFloat16 是一种 16 位浮点数据类型,由 8 位指数、符号位和 7 位尾数组成。 它适用于机器学习和 AI 应用。 ClickHouse 支持在 Float32BFloat16 之间进行转换, 可使用 toFloat32()toBFloat16 函数。
暂不支持大多数其他操作。
最后修改于 2026年6月10日