

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

# Tipos numéricos
<a name="Numeric_types"></a>

Os tipos de dados numéricos incluem números inteiros, decimais e números de ponto flutuante. 

**Topics**
+ [Tipos de inteiros](Numeric_types-integer-types.md)
+ [Tipo DECIMAL ou NUMERIC](Numeric_types-decimal-or-numeric-type.md)
+ [Tipos de ponto flutuante](Numeric_types-floating-point-types.md)
+ [Computações com valores numéricos](Numeric_computations.md)

# Tipos de inteiros
<a name="Numeric_types-integer-types"></a>

Use os seguintes tipos de dados para armazenar números inteiros de vários intervalos. Não é possível armazenar valores fora do intervalo permitido para cada tipo. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/clean-rooms/latest/sql-reference/Numeric_types-integer-types.html)

# Tipo DECIMAL ou NUMERIC
<a name="Numeric_types-decimal-or-numeric-type"></a>

Use o tipo de dados DECIMAL ou NUMERIC para armazenar valores com uma *precisão definida pelo usuário*. As palavras-chave DECIMAL e NUMERIC são intercambiáveis. Neste documento, *decimal* é o termo preferido para esse tipo de dados. O termo *numeric* é usado genericamente para se referir aos tipos de dados de número inteiro, decimal e de ponto flutuante. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/clean-rooms/latest/sql-reference/Numeric_types-decimal-or-numeric-type.html)

Defina uma coluna DECIMAL em uma tabela especificando um *precision* e: *scale* 

```
decimal(precision, scale)
```

 *precision*   
O número total de dígitos significativos no valor inteiro: o número de dígitos em ambos os lados do ponto decimal. Por exemplo, o número `48.2891` tem precisão de 6 e uma escala de 4. A precisão padrão, quando não especificada, é 18. A precisão máxima é 38.  
 Se o número de dígitos à esquerda da vírgula decimal em um valor de entrada exceder a precisão da coluna menos sua escala, o valor não poderá ser copiado na coluna (ou inserido ou atualizado). Esta regra aplica-se a qualquer valor que caia fora do intervalo de definição da coluna. Por exemplo, o intervalo permitido de valores para uma coluna `numeric(5,2)` é `-999.99` a `999.99`. 

 *scale*   
O número de dígitos decimais na parte fracionada do valor, à direita do ponto decimal. Números inteiros têm uma escala de zero. Em uma especificação de coluna, o valor de escala deve ser menor ou igual ao valor de precisão. A escala padrão, quando não especificada, é 0. A escala máxima é 37.  
Se a escala de um valor de entrada carregado em uma tabela for maior do que a escala da coluna, o valor será arredondado para a escala especificada. Por exemplo, a coluna PRICEPAID na tabela SALES é uma coluna DECIMAL(8,2). Se um valor DECIMAL(8,4) é inserido na coluna PRICEPAID, o valor é arredondado para uma escala de 2.   

```
insert into sales
values (0, 8, 1, 1, 2000, 14, 5, 4323.8951, 11.00, null);

select pricepaid, salesid from sales where salesid=0;

pricepaid | salesid
-----------+---------
4323.90 |       0
(1 row)
```
 Contudo, os resultados de conversões explícitas dos valores selecionados a partir de tabelas não são arredondados.

**nota**  
O valor positivo máximo que você pode inserir na coluna DECIMAL(19,0) é `9223372036854775807` (263 -1). O valor negativo máximo é `-9223372036854775807`. Por exemplo, uma tentativa de inserir o valor `9999999999999999999` (19 noves) causará um erro de transbordamento. Independentemente do posicionamento do ponto decimal, a maior string que o AWS Clean Rooms pode representar como um número DECIMAL é `9223372036854775807`. Por exemplo, o maior valor que você pode carregar em uma coluna DECIMAL(19,18) é `9.223372036854775807`.  
Essas regras ocorrem por causa do seguinte:   
Valores DECIMAL com 19 ou menos dígitos significativos de precisão são armazenados internamente como valores inteiros de 8 bytes.
Valores DECIMAL com 20 a 38 dígitos significativos de precisão são armazenados como valores inteiros de 16 bytes.

## Observações sobre o uso de colunas do tipo DECIMAL ou NUMERIC de 128 bits
<a name="Numeric_types-notes-about-using-128-bit-decimal-or-numeric-columns"></a>

Não designe arbitrariamente a precisão máxima às colunas do tipo DECIMAL, a não ser que você esteja certo de que sua aplicação requer essa precisão. Valores de 128 bits usam duas vezes mais espaço em disco do que valores de 64 bits e podem retardar o tempo de execução da consulta. 

# Tipos de ponto flutuante
<a name="Numeric_types-floating-point-types"></a>

Use os tipos de dados REAL e DOUBLE PRECISION para armazenar valores numéricos com *precisão variável*. Esses tipos são *inexatos*, o que significa que alguns valores são armazenados como aproximações, de tal forma que o armazenamento e retorno de um valor específico pode resultar em ligeiras discrepâncias. Se você precisar de armazenamento e cálculos precisos (como para quantidades monetárias), use o tipo de dados DECIMAL.

REAL representa o formato de ponto flutuante de precisão simples, de acordo com o padrão IEEE 754 para aritmética de ponto flutuante. Tem uma precisão de cerca de 6 dígitos e um intervalo de cerca de 1E-37 a 1E\$137. Você também pode especificar esse tipo de dados como FLOAT4.

DOUBLE PRECISION representa o formato de ponto flutuante de precisão dupla, de acordo com o padrão 754 do IEEE para aritmética de ponto flutuante binário. Tem uma precisão de cerca de 15 dígitos e um intervalo de cerca de 1E-307 a 1E\$1308. Você também pode especificar esse tipo de dados como FLOAT ou FLOAT8.

# Computações com valores numéricos
<a name="Numeric_computations"></a>

Em AWS Clean Rooms, *computação* se refere a operações matemáticas binárias: adição, subtração, multiplicação e divisão. Esta seção descreve os tipos de retorno previstos para essas operações, assim como a fórmula específica que é aplicada para determinar a precisão e escala quando dados do tipo DECIMAL estão envolvidos. 

Quando os valores numéricos são computados durante o processamento da consulta, você pode encontrar casos onde o cálculo é impossível e a consulta retorna um erro de transbordamento numérico. Você também pode encontrar casos em que a escala de valores computados varia ou é inesperada. Para algumas operações, você pode usar a conversão explícita (promoção do tipo) ou parâmetros de configuração do AWS Clean Rooms para contornar esses problemas. 

Para obter informações sobre os resultados de computações semelhantes com funções SQL, consulte [AWS Clean Rooms Funções do Spark SQL](sql-functions-topic-spark.md). 

## Tipos de retorno para computações
<a name="Numeric_computations-return-types"></a>

Dado o conjunto de tipos de dados numéricos suportados em AWS Clean Rooms, a tabela a seguir mostra os tipos de retorno esperados para operações de adição, subtração, multiplicação e divisão. A primeira coluna do lado esquerdo da tabela representa o primeiro operando no cálculo e a linha superior representa o segundo operando. 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/clean-rooms/latest/sql-reference/Numeric_computations.html)

## Precisão e escala de resultados de DECIMAL computados
<a name="Numeric_computations-precision-and-scale-of-computed-decimal-results"></a>

A tabela a seguir resume as regras para precisão e escala resultantes de computação quando operações matemáticas retornam resultados DECIMAIS. Nesta tabela, `p1` e `s1` represente a precisão e a escala do primeiro operando em um cálculo. `p2`e `s2` representam a precisão e a escala do segundo operando. (Independentemente desses cálculos, a precisão máxima de resultado é 38 e a escala máxima de resultado é 38.) 

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/pt_br/clean-rooms/latest/sql-reference/Numeric_computations.html)

Por exemplo, as colunas PRICEPAID e COMMISSION na tabela SALES são ambas colunas do tipo DECIMAL(8,2). Se você dividir PRICEPAID pela COMMISSION (ou vice-versa), a fórmula será aplicada da seguinte forma: 

```
Precision = 8-2 + 2 + max(4,2+8-2+1)
= 6 + 2 + 9 = 17

Scale = max(4,2+8-2+1) = 9

Result = DECIMAL(17,9)
```

O seguinte cálculo é a regra geral para computação da precisão e escala resultantes para operações executadas em valores DECIMAIS com operadores de conjunto tais como UNION, INTERSECT e EXCEPT ou funções como COALESCE e DECODE: 

```
Scale = max(s1,s2)
Precision = min(max(p1-s1,p2-s2)+scale,19)
```

Por exemplo, uma DEC1 tabela com uma coluna DECIMAL (7,2) é unida a uma DEC2 tabela com uma coluna DECIMAL (15,3) para criar uma tabela. DEC3 O esquema de DEC3 mostra que a coluna se torna uma coluna NUMÉRICA (15,3). 

```
select * from dec1 union select * from dec2;
```

No exemplo acima, a fórmula é aplicada da seguinte forma: 

```
Precision = min(max(7-2,15-3) + max(2,3), 19)
= 12 + 3 = 15

Scale = max(2,3) = 3

Result = DECIMAL(15,3)
```

## Observações sobre operações de divisão
<a name="Numeric_computations-notes-on-division-operations"></a>

Para operações de divisão, divide-by-zero as condições retornam erros. 

O limite de escala de 100 é aplicado após o cálculo da precisão e escala. Se a escala de resultados calculada for maior que 100, os resultados da divisão serão escalados da seguinte forma:
+ Precisão = ` precision - (scale - max_scale)` 
+ Dimensionar = ` max_scale ` 

Se a precisão calculada for maior do que a precisão máxima (38), a precisão será reduzida para 38 e a escala será o resultado de: `max(38 + scale - precision), min(4, 100))` 

## Condições de transbordamento
<a name="Numeric_computations-overflow-conditions"></a>

O transbordamento é verificado para todas as computações numéricas. Dados DECIMAIS com uma precisão de 19 ou o menos são armazenados como números inteiros de 64 bits. Dados DECIMAIS com uma precisão maior que 19 são armazenados como números inteiros de 128 bits. A precisão máxima para todos os valores DECIMAIS é 38 e a escala máxima é 37. Erros de transbordamento ocorrem quando um valor excede esses limites, que se aplicam a conjuntos de resultados intermediário e final: 
+ A conversão explícita resulta em erros de estouro de tempo de execução quando valores de dados específicos não se ajustam à precisão ou escala solicitada especificada pela função de conversão. Por exemplo, você não pode converter todos os valores da coluna PRICEPAID na tabela SALES (uma coluna DECIMAL(8,2)) e retornar um resultado DECIMAL(7,3): 

  ```
  select pricepaid::decimal(7,3) from sales;
  ERROR:  Numeric data overflow (result precision)
  ```

  Este erro ocorre porque *alguns* dos valores maiores na coluna PRICEPAID não podem ser convertidos.
+ As operações de multiplicação produzem resultados em que a escala de resultados é a soma de escala de cada operando. Se ambos os operandos têm uma escala de 4, por exemplo, a escala de resultados é 8, deixando apenas 10 dígitos para o lado esquerdo do ponto decimal. Portanto, é relativamente fácil se deparar com condições de transbordamento ao multiplicar dois números grandes que possuem uma escala significativa.

## Cálculos numéricos com os tipos INTEGER e DECIMAL
<a name="Numeric_computations-numeric-calculations-with-integer-and-decimal-types"></a>

Quando um dos operandos em um cálculo tem um tipo de dados INTEGER e o outro operando é DECIMAL, o operando INTEGER é convertido implicitamente como DECIMAL. 
+ SMALLINT ou SHORT é convertido como DECIMAL (5,0) 
+ INTEGER é convertido como DECIMAL(10,0) 
+ BIGINT ou LONG é convertido como DECIMAL (19,0) 

Por exemplo, se você multiplicar SALES.COMMISSION, uma coluna DECIMAL(8,2), e SALES.QTYSOLD, uma coluna SMALLINT, este cálculo será convertido como: 

```
DECIMAL(8,2) * DECIMAL(5,0)
```