Garanta a Eficiência: Escolhendo entre tipos decimais no SQL
Published: 2023-07-12 00:30:56

Decimais, existem tantos e qual devo escolher ? Saiba que essa decisão é de total importância para não perder dinheiro em seu software.

## Conteúdo

1. [Prólogo](#1)
2. [Tipos decimais SQL](#2)
3. [O que é essa precisão ?](#3)
4. [Então quando eu não ira querer precisão](#4)
5. [Vamos observar na prática](#5)
6. [Conclusão](#6)


### 1. Prólogo <a name="1"></a>
Sempre tive dúvidas sobre a razão pela qual existem tantos tipos de dados `decimais` no SQL e quando é apropriado utilizá-los, especialmente ao lidar com valores monetários, onde a consistência dos cálculos e a precisão são fundamentais para **evitar perdas financeiras**. Muitos desses tipos de dados são desconhecidos ou subutilizados no cotidiano de um desenvolvedor web. No entanto, estar ciente dos seus casos de uso diferenças é uma vantagem significativa para quando precisar usar você conseguir identificar.

### 2. Tipos decimais SQL<a name="2"></a>
Existem diversos tipos de dados decimais disponíveis no SQL, cada um com seu próprio propósito e comportamento. Vamos explorar alguns dos tipos mais comuns:

1. DECIMAL/NUMERIC

O tipo `DECIMAL` possui um alias (apelido) chamado `NUMERIC`, ou seja ambos têm o mesmo comportamento. Esse tipo é especialmente adequado para lidar com valores precisos, como dinheiro, onde é crucial manter a exatidão das informações.

2. FLOAT

O tipo `FLOAT` é recomendado para valores aproximados, como estatísticas, por serem eficientes em termos de espaço de armazenamento e desempenho, ocupando um total de 4 bytes de espaço de armazenamento.

3. DOUBLE

O campo `DOUBLE` também é apropriado para valores aproximados, mas oferece um range de valores maior em comparação ao `FLOAT`. Para acomodar essa flexibilidade, ele requer 8 bytes de espaço de armazenamento. 

### 3. O que é essa precisão ?<a name="3"></a>
Essa precisão é você saber que se um cliente comprar 2 produtos que custam R$ 20,30 ele vai pagar R$ 20,60 e não R$ 20,59999931231232321. 


### 4. Então quando eu não ira querer precisão ?<a name="4"></a>
Embora o `float` possa introduzir variações nos cálculos, há casos de uso em que eles são vantajosos na prática. Aqui estão dois exemplos:

1. Cálculos científicos e simulações: Em muitas áreas da ciência e da engenharia, os cálculos envolvem números que não exigem uma precisão extrema. Nesses casos, o uso de `float` pode ser adequado, pois oferece uma representação aproximada dos valores com eficiência de espaço e desempenho. Por exemplo, em simulações físicas, como modelos de sistemas climáticos ou mecânicos, a precisão aproximada fornecida pelos números de ponto flutuante é suficiente e pode acelerar significativamente os cálculos.
   
2. Processamento gráfico: Em aplicações de computação gráfica, como jogos ou renderização de imagens, o uso de `float` é comum para representar coordenadas 3D, cores e transformações. A natureza aproximada dos números de ponto flutuante não é perceptível para a maioria dos usuários, e a velocidade de processamento é fundamental nesses casos.

### 5. Vamos observar na prática<a name="5"></a>

Criaremos uma tabela para testes chamada decimals

```sql
CREATE TABLE decimals (
  n INT,
  d1 DECIMAL(10, 2),
  d2 FLOAT, -- 4 bytes
  d3 DOUBLE -- 8 bytes
);

INSERT INTO decimals
VALUES
(1, 100.40, 100.40, 100.40),
(1, -80.00, -80.00, -80.00);

SELECT sum(d1), sum(d2), sum(d3) FROM decimals GROUP BY n;
```

Ao executar o SELECT vamos ter o seguinte resultado

|sum(d1)|sum(d2)|sum(d3)|
|---|---|---|
|20.40|20.400001525878906|20.400000000000006|

Nesse exemplo, criamos uma tabela chamada "decimals" com três colunas: "d1" do tipo DECIMAL(10, 2), "d2" do tipo FLOAT e "d3" do tipo DOUBLE. Em seguida, inserimos duas linhas de dados nessa tabela.

Ao realizar a soma dos valores de cada coluna usando a cláusula GROUP BY, podemos observar as diferenças resultantes. A coluna "d1", que utiliza o tipo DECIMAL com precisão fixa de duas casas decimais, apresenta um resultado preciso de 20.40.

No entanto, as colunas "d2" (FLOAT) e "d3" (DOUBLE) demonstram as variações típicas dos números de ponto flutuante. Embora os valores somados sejam teoricamente iguais a 20.40, devido à representação aproximada desses tipos, ocorrem pequenas variações nos resultados. Essas variações podem ocorrer devido a erros de arredondamento ou limitações na precisão dos bits usados para representar os números.

Essas diferenças podem parecer insignificantes, mas em casos que exigem precisão exata, como manipulação de valores monetários, elas podem levar a perdas ou erros nos cálculos financeiros.

### 6. Conclusão <a name="6"></a>
Exploramos os diferentes tipos de dados decimais no `SQL` e destacamos a importância de escolher o tipo correto com base nas necessidades específicas. Ao lidar com valores monetários e cálculos que exigem precisão absoluta, é recomendado utilizar tipos decimais de precisão fixa, como `DECIMAL` ou `NUMERIC`. Esses tipos garantem resultados consistentes e evitam perdas de valor.

Embora os números de ponto flutuante (float) possam ser vantajosos em determinados cenários, e**les podem introduzir variações nos cálculos** devido à natureza aproximada da representação. É essencial avaliar o contexto e a precisão necessária para evitar problemas de arredondamento.