跳至主要内容

Float32、Float64

注意

如果您需要精确计算,特别是如果您处理需要高精度的财务或业务数据,则应考虑使用 Decimal 类型。

浮点数 可能会导致不准确的结果,如下所示

CREATE TABLE IF NOT EXISTS float_vs_decimal
(
my_float Float64,
my_decimal Decimal64(3)
)
Engine=MergeTree
ORDER BY tuple();

# Generate 1 000 000 random numbers with 2 decimal places and store them as a float and as a decimal
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.60500000004 │ 499693.605 │
└────────────────────┴─────────────────┘

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

┌─sumKahan(my_float)─┬─sumKahan(my_decimal)─┐
│ 499693.605 │ 499693.605 │
└────────────────────┴──────────────────────┘

ClickHouse 和 C 中的等效类型如下所示

  • Float32float
  • Float64double

ClickHouse 中的浮点类型具有以下别名

  • Float32FLOATREALSINGLE
  • Float64DOUBLEDOUBLE 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 │
└──────────────┘

请参阅 ORDER BY 子句 部分中有关 NaN 排序的规则。