Если вам нужны точные вычисления, в частности, если вы работаете с финансовыми или бизнес-данными, требующими высокой точности, следует рассмотреть возможность использования Decimal.
Числа с плавающей запятой могут приводить к неточным результатам, как показано ниже:
Сгенерировать 1 000 000 случайных чисел с 2 знаками после запятой и сохранить их в форматах float и decimal
INSERT INTO float_vs_decimal SELECT round(randCanonical(), 3) AS res, res FROM system.numbers LIMIT 1000000;
Эквивалентные типы в 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 их игнорирует.
Использование чисел с плавающей запятой
- Вычисления с числами с плавающей запятой могут приводить к ошибке округления.
- Результат вычислений зависит от способа их выполнения (типа процессора и архитектуры компьютерной системы).
- Вычисления с плавающей запятой могут приводить к значениям, таким как бесконечность (
Inf) и «не число» (NaN). Это следует учитывать при обработке результатов вычислений. - При разборе (парсинге) чисел с плавающей запятой из текста результат может отличаться от ближайшего машинно представимого числа.
NaN и Inf
В отличие от стандартного SQL, ClickHouse поддерживает следующие категории чисел с плавающей запятой:
Inf– бесконечность.
-Inf— отрицательная бесконечность.
NaN— не число (Not a Number).
См. правила сортировки значения NaN в разделе Предложение ORDER BY.
BFloat16
BFloat16 — это 16-битный тип данных с плавающей запятой с 8-битной экспонентой, знаком и 7-битной мантиссой.
Он полезен для задач машинного обучения и приложений ИИ.
ClickHouse поддерживает преобразования между Float32 и BFloat16, которые
можно выполнять с помощью функций toFloat32() или toBFloat16.
Большинство других операций не поддерживаются.