Float32 | Float64 | BFloat16 类型
注意
如果您需要精确的计算,尤其是在处理需要高精度的金融或商业数据时,应考虑使用 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 中的等效类型
Float32
—float
。Float64
—double
。
ClickHouse 中的浮点类型具有以下别名
Float32
—FLOAT
,REAL
,SINGLE
。Float64
—DOUBLE
,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 支持 Float32
和 BFloat16
之间的转换,可以使用 toFloat32()
或 toBFloat16
函数完成。
注意
大多数其他操作不受支持。