Если вам нужны точные вычисления, особенно при работе с финансовыми или бизнес-данными, требующими высокой точности, стоит использовать Decimal.Числа с плавающей запятой могут давать неточные результаты, как показано ниже:
Float32—float.Float64—double.
Float32—FLOAT,REAL,SINGLE.Float64—DOUBLE,DOUBLE PRECISION.
FLOAT(12), FLOAT(15, 22), DOUBLE(12), DOUBLE(4, 18)), но ClickHouse их игнорирует.
Использование чисел с плавающей запятой
- При вычислениях с числами с плавающей запятой может возникать ошибка округления.
- Результат вычислений зависит от способа вычислений (типа процессора и архитектуры компьютерной системы).
- Вычисления с числами с плавающей запятой могут давать такие значения, как бесконечность (
Inf) и «не число» (NaN). Это следует учитывать при обработке результатов вычислений. - При разборе чисел с плавающей запятой из текста результат может не быть ближайшим числом, представимым в машинном формате.
NaN и Inf
Inf— бесконечность.
-Inf— Отрицательная бесконечность.
NaN— не является числом.
NaN см. в разделе предложение ORDER BY.
Значения NaN в семантике множеств
NaN так, что скалярное сравнение NaN = NaN возвращает false.
ClickHouse следует этому правилу для оператора =.
Однако NaN — это не одно конкретное значение, а любой битовый шаблон, у которого экспонента состоит целиком из единиц, а
мантисса не равна нулю. Разные операции и разные архитектуры CPU могут порождать значения NaN
с разными знаковыми битами или разной полезной нагрузкой мантиссы. Например:
0./0.даётNaN, у которого на большинстве платформ x86 знаковый бит равен 1.- Литерал
nanдаётNaN, у которого знаковый бит равен 0. - После PR #98230 путь AArch64 NEON для
logвозвращаетNaN, у которого знаковый бит отличается от скалярногоlogиз glibc для отрицательных входных значений.
NaN хешируются в
разные корзины и рассматриваются как разные значения в операциях с семантикой множеств, включая
DISTINCT, GROUP BY, uniqExact, countDistinct и equi-JOIN по ключу Float:
NaN не равен ни одному другому значению, включая самого себя),
но может показаться неожиданным. Если вам нужно, чтобы операции с семантикой множеств считали все значения NaN равными,
приведите их к каноническому виду в запросе:
DISTINCT, GROUP BY и JOIN.
BFloat16
BFloat16 — это 16-битный тип данных с плавающей запятой с 8-битными экспонентой и знаком, а также 7-битной мантиссой.
Он полезен для приложений машинного обучения и ИИ.
ClickHouse поддерживает преобразования между Float32 и BFloat16, которые
можно выполнять с помощью функций toFloat32() или toBFloat16.
Большинство других операций не поддерживается.