Pular para o conteúdo principal
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:
CREATE TABLE IF NOT EXISTS float_vs_decimal
(
   my_float Float64,
   my_decimal Decimal64(3)
)
ENGINE=MergeTree
ORDER BY tuple();

# Gere 1 000 000 números aleatórios com 2 casas decimais e armazene-os como float e como 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.60500000004499693.605
└────────────────────┴─────────────────┘

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

┌─sumKahan(my_float)─┬─sumKahan(my_decimal)─┐
499693.605499693.605
└────────────────────┴──────────────────────┘
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.
SELECT 1 - 0.9

┌───────minus(1, 0.9)─┐
0.09999999999999998
└─────────────────────┘
  • 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.
SELECT 0.5 / 0

┌─divide(0.5, 0)─┐
│            inf │
└────────────────┘
  • -Inf — Infinito negativo.
SELECT -0.5 / 0

┌─divide(-0.5, 0)─┐
-inf │
└─────────────────┘
  • NaN — Não é um número.
SELECT 0 / 0

┌─divide(0, 0)─┐
│          nan │
└──────────────┘
Consulte as regras de ordenação de NaN na seção cláusula ORDER BY.

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 10 de junho de 2026