Skip to main content
Se você precisa de cálculos precisos, especialmente se trabalha com dados financeiros ou de negócios que exigem alta precisão, considere usar Decimal.Números de ponto flutuante podem levar a resultados imprecisos, como ilustrado abaixo:
Os tipos equivalentes no ClickHouse e em C são os seguintes:
  • Float32float.
  • Float64double.
Os tipos Float no ClickHouse têm os seguintes aliases:
  • Float32FLOAT, REAL, SINGLE.
  • Float64DOUBLE, DOUBLE PRECISION.
Ao criar tabelas, é possível definir parâmetros numéricos para números de ponto flutuante (por exemplo, FLOAT(12), FLOAT(15, 22), DOUBLE(12), DOUBLE(4, 18)), mas o ClickHouse os ignora.

Uso de números de ponto flutuante

  • Cálculos com números de ponto flutuante podem produzir erro de arredondamento.
  • O resultado do cálculo depende do método de cálculo (do tipo de processador e da arquitetura do sistema computacional).
  • Cálculos de ponto flutuante podem resultar em números como infinito (Inf) e “não é um número” (NaN). Isso deve ser levado em conta ao processar os resultados dos cálculos.
  • Ao interpretar números de ponto flutuante a partir de texto, o resultado pode não ser o número representável pela máquina mais próximo.

NaN e Inf

Ao contrário do SQL padrão, o ClickHouse oferece suporte às seguintes categorias de números de ponto flutuante:
  • Inf – infinito.
  • -Inf — Infinito negativo.
  • NaN — Não é um número.
Consulte as regras de ordenação de NaN na seção cláusula ORDER BY.

Valores NaN na semântica de conjunto

O padrão IEEE 754 define NaN de modo que a comparação escalar NaN = NaN retorne false. O ClickHouse segue essa regra para o operador =. No entanto, NaN não é um único valor; ele pode ser qualquer padrão de bits em que o expoente é composto apenas por uns e a mantissa é diferente de zero. Operações diferentes e arquiteturas de CPU diferentes podem produzir valores NaN com bits de sinal diferentes ou payloads de mantissa diferentes. Por exemplo:
  • 0./0. produz um NaN cujo bit de sinal é 1 na maioria das plataformas x86.
  • O literal nan produz um NaN cujo bit de sinal é 0.
  • Após o PR #98230, o caminho NEON em AArch64 de log retorna um NaN cujo bit de sinal difere do log escalar da glibc para entradas negativas.
As tabelas hash no ClickHouse comparam chaves byte a byte, portanto padrões de bits NaN diferentes caem em buckets diferentes e são tratados como valores distintos por operações com semântica de conjunto, incluindo DISTINCT, GROUP BY, uniqExact, countDistinct e equi-JOIN em uma chave Float:
Isso está de acordo com a IEEE 754 (todo NaN é diferente de qualquer outro valor, inclusive de si mesmo) mas pode causar estranheza. Se você precisar que operações com semântica de conjunto tratem todos os valores NaN como iguais, normalize-os na consulta:
A mesma abordagem funciona para as chaves de DISTINCT, GROUP BY e JOIN.

BFloat16

BFloat16 é um tipo de dado de ponto flutuante de 16 bits, com expoente de 8 bits, sinal e mantissa de 7 bits. Ele é útil para aplicações de aprendizado de máquina e IA. O ClickHouse oferece suporte a conversões entre Float32 e BFloat16, que podem ser realizadas com as funções toFloat32() ou toBFloat16.
A maioria das outras operações não tem suporte.
Última modificação em 3 de julho de 2026