

Les traductions sont fournies par des outils de traduction automatique. En cas de conflit entre le contenu d'une traduction et celui de la version originale en anglais, la version anglaise prévaudra.

# Types numériques
<a name="Numeric_types"></a>

Les types de données numériques incluent les entiers, les décimaux et les nombres à virgule flottante. 

**Topics**
+ [Types d’entier](Numeric_types-integer-types.md)
+ [Type DECIMAL ou NUMERIC](Numeric_types-decimal-or-numeric-type.md)
+ [Types à virgule flottante](Numeric_types-floating-point-types.md)
+ [Calculs avec les valeurs numériques](Numeric_computations.md)

# Types d’entier
<a name="Numeric_types-integer-types"></a>

Utilisez les types de données suivants pour stocker des nombres entiers de différentes plages. Vous ne pouvez pas stocker de valeurs en dehors de la plage autorisée pour chaque type. 

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

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

Utilisez le type de données DECIMAL ou NUMERIC pour stocker les valeurs avec une *précision définie par l’utilisateur*. Les mots clés DECIMAL et NUMERIC sont interchangeables. Dans ce document, *decimal* est le terme privilégié pour ce type de données. Le terme *numeric* (numérique) est utilisé de façon générique pour faire référence aux types de données integer, decimal et floating-point (entier, décimal et virgule flottante). 

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

Définissez une colonne DECIMAL dans un tableau en spécifiant a *precision* et *scale* : 

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

 *precision*   
Le nombre total de chiffres significatifs dans la valeur entière : le nombre de chiffres de chaque côté de la virgule. Par exemple, le nombre `48.2891` a une précision de 6 et une échelle de 4. La précision par défaut, si elle n’est pas spécifiée, est de 18. La précision maximale est de 38.  
 Si le nombre de chiffres à gauche de la virgule décimale dans une valeur d'entrée dépasse la précision de la colonne moins son échelle, la valeur ne peut pas être copiée dans la colonne (ni insérée ou mise à jour). Cette règle s’applique à toute valeur qui se trouve en dehors de la plage de la définition de la colonne. Par exemple, la plage autorisée de valeurs pour une colonne `numeric(5,2)` s’étend de `-999.99` à `999.99`. 

 *scale*   
Le nombre de chiffres décimaux de la partie fractionnaire de la valeur, à droite de la virgule. Les entiers possèdent une échelle égale à zéro. Dans une spécification de colonne, la valeur de l’échelle doit être inférieure ou égale à la valeur de la précision. L’échelle par défaut, si elle n’est pas spécifiée, est de 0. L’échelle maximale est de 37.  
Si l’échelle d’une valeur d’entrée chargée dans une table est supérieure à l’échelle de la colonne, la valeur est arrondie à l’échelle spécifiée. Par exemple, la colonne PRICEPAID de la table SALES est une colonne DECIMAL(8,2). Si une valeur DECIMAL(8,4) est insérée dans la colonne PRICEPAID, la valeur est arrondie à une échelle 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)
```
 Cependant, les résultats de conversions explicites de valeurs sélectionnées dans les tables ne sont pas arrondis.

**Note**  
La valeur positive maximale que vous pouvez insérer dans une colonne DECIMAL(19,0) est `9223372036854775807` (263 -1). La valeur négative maximale est `-9223372036854775807`. Par exemple, une tentative d’insérer la valeur `9999999999999999999` (19 fois le chiffre neuf) entraîne une erreur de dépassement de capacité. Quel que soit le placement de la virgule décimale, la plus grande chaîne qu' AWS Clean Rooms puisse représenter comme nombre DECIMAL est `9223372036854775807`. Par exemple, la plus grande valeur que vous puissiez charger dans une colonne DECIMAL(19,18) est `9.223372036854775807`.  
Ces règles sont dues aux raisons suivantes :   
Les valeurs DECIMAL dont la précision est inférieure ou égale à 19 chiffres significatifs sont stockées en interne sous forme de nombres entiers de 8 octets.
Les valeurs DECIMAL avec une précision de 20 à 38 chiffres significatifs sont stockées sous forme de nombres entiers de 16 octets.

## Notes sur l’utilisation des colonnes DECIMAL ou NUMERIC 128 bits
<a name="Numeric_types-notes-about-using-128-bit-decimal-or-numeric-columns"></a>

N’attribuez pas de façon arbitraire une précision maximale aux colonnes DECIMAL, sauf si vous avez la certitude que votre application a besoin de cette précision. Les valeurs 128 bits utilisent deux fois plus d’espace disque que les valeurs 64 bits et peuvent ralentir le temps d’exécution des requêtes. 

# Types à virgule flottante
<a name="Numeric_types-floating-point-types"></a>

Utilisez les types de données REAL et DOUBLE PRECISION pour stocker les valeurs numériques avec une *précision variable*. Ces types sont des types *inexacts*, ce qui signifie que certaines valeurs sont stockées comme approximations, de telle sorte que le stockage et le retour d’une valeur spécifique peuvent se traduire par de légers écarts. Si vous avez besoin d’un stockage et d’un calcul exacts (pour des montants monétaires, par exemple), utilisez le type de données DECIMAL.

REAL représente le format à virgule flottante à précision unique, conformément à la norme IEEE 754 pour l'arithmétique à virgule flottante. Il a une précision d’environ 6 chiffres et une plage d’environ 1E-37 à 1E\$137. Vous pouvez également spécifier ce type de données sous la forme FLOAT4.

DOUBLE PRECISION représente le format de virgule flottante en double précision, conformément à la norme IEEE 754 pour l’arithmétique binaire en virgule flottante. Il a une précision d’environ 15 chiffres et une plage d’environ 1E-307 à 1E\$1308. Vous pouvez également spécifier ce type de données sous la forme FLOAT ou FLOAT8.

# Calculs avec les valeurs numériques
<a name="Numeric_computations"></a>

Dans AWS Clean Rooms, le *calcul* fait référence aux opérations mathématiques binaires : addition, soustraction, multiplication et division. Cette section décrit les types de retour attendus pour ces opérations, ainsi que la formule spécifique appliquée pour déterminer la précision et l’échelle lorsque les types de données DECIMAL sont impliqués. 

Lorsque des valeurs numériques sont calculées pendant le traitement des requêtes, vous pouvez rencontrer des cas où le calcul est impossible et où la requête renvoie une erreur de dépassement de capacité numérique. Vous pouvez également rencontrer des cas où l’échelle des valeurs calculées varie ou est inattendue. Pour certaines opérations, vous pouvez utiliser le transtypage explicite (promotion de type) ou les paramètres de configuration de AWS Clean Rooms afin de contourner ces problèmes. 

Pour plus d’informations sur les résultats de calculs similaires avec les fonctions SQL, consultez [AWS Clean Rooms Fonctions Spark SQL](sql-functions-topic-spark.md). 

## Types de retour pour les calculs
<a name="Numeric_computations-return-types"></a>

Compte tenu de l'ensemble des types de données numériques pris en charge dans AWS Clean Rooms, le tableau suivant indique les types de retour attendus pour les opérations d'addition, de soustraction, de multiplication et de division. La première colonne sur la gauche du tableau représente le premier opérande dans le calcul et la ligne du haut le second opérande. 

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

## Précision et échelle des résultats DECIMAL calculés
<a name="Numeric_computations-precision-and-scale-of-computed-decimal-results"></a>

Le tableau suivant résume les règles de calcul de la précision et de l’échelle obtenues lorsque les opérations mathématiques retournent des résultats DECIMAL. Dans ce tableau, `p1` et `s1` représentez la précision et l'échelle du premier opérande d'un calcul. `p2`et `s2` représentent la précision et l'échelle du deuxième opérande. (Quels que soient les calculs, la précision maximale du résultat est de 38 et l’échelle maximale du résultat de 38 également.) 

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

Par exemple, les colonnes PRICEPAID et COMMISSION de la table SALES sont toutes deux des colonnes DECIMAL(8,2). Si vous divisez PRICEPAID par COMMISSION (ou inversement), la formule est appliquée comme suit : 

```
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)
```

Le calcul suivant constitue la règle générale pour le calcul de la précision et de l’échelle obtenues dans le cas des opérations effectuées sur les valeurs DECIMAL avec les opérateurs définis tels que UNION, INTERSECT et EXCEPT, ou les fonctions comme COALESCE et DECODE : 

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

Par exemple, une DEC1 table avec une colonne DECIMAL (7,2) est jointe à une DEC2 table avec une colonne DECIMAL (15,3) pour créer une table. DEC3 Le schéma de DEC3 montre que la colonne devient une colonne NUMERIC (15,3). 

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

Dans l’exemple ci-dessus, la formule est appliquée comme suit : 

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

Scale = max(2,3) = 3

Result = DECIMAL(15,3)
```

## Remarques sur les opérations de division
<a name="Numeric_computations-notes-on-division-operations"></a>

Pour les opérations de division, divide-by-zero les conditions renvoient des erreurs. 

La limite d’échelle de 100 est appliquée après le calcul de la précision et de l’échelle. Si l’échelle de résultat calculée est supérieure à 100, les résultats de la division sont mis à l’échelle comme suit :
+ Précision = ` precision - (scale - max_scale)` 
+ Évolutivité = ` max_scale ` 

Si la précision calculée est supérieure à la précision maximale (38), la précision est réduite à 38, et l’échelle devient le résultat de : `max(38 + scale - precision), min(4, 100))` 

## Conditions de dépassement de capacité
<a name="Numeric_computations-overflow-conditions"></a>

Le dépassement de capacité est contrôlé pour tous les calculs numériques. Les données DECIMAL avec une précision de 19 ou moins sont stockées en tant qu’entiers 64 bits. Les données DECIMAL avec une précision supérieure à 19 sont stockées sous forme d’entiers 128 bits. La précision maximale de toutes les valeurs DECIMAL est 38 et l’échelle maximale 37. Les erreurs de dépassement de capacité se produisent quand une valeur dépasse ces limites, qui s’appliquent aux jeux de résultats intermédiaires et finaux : 
+ Le casting explicite entraîne des erreurs de dépassement d'exécution lorsque des valeurs de données spécifiques ne correspondent pas à la précision ou à l'échelle requises spécifiées par la fonction de conversion. Par exemple, vous ne pouvez pas convertir toutes les valeurs de la colonne PRICEPAID de la table SALES (une colonne DECIMAL (8,2)) et renvoyer un résultat DECIMAL (7,3) : 

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

  Cette erreur se produit car *certaines* des valeurs les plus élevées de la colonne PRICEPAID ne peuvent pas être converties.
+ Les opérations de multiplication produisent des résultats dans lesquels l’échelle du résultat est la somme des échelles de chaque opérande. Si les deux opérandes ont une échelle de 4, par exemple, l’échelle du résultat est 8, ce qui ne laisse que 10 chiffres à gauche de la virgule. Par conséquent, il est relativement facile de se trouver en situation de dépassement de capacité lors de la multiplication de deux grands nombres ayant une échelle significative.

## Calculs numériques avec les types INTEGER et DECIMAL
<a name="Numeric_computations-numeric-calculations-with-integer-and-decimal-types"></a>

Lorsque l'un des opérandes d'un calcul est de type INTEGER et que l'autre est DECIMAL, l'opérande INTEGER est implicitement converti en DECIMAL. 
+ SMALLINT ou SHORT est converti en DECIMAL (5,0) 
+ INTEGER est converti en DECIMAL (10,0) 
+ BIGINT ou LONG est converti en DECIMAL (19,0) 

Par exemple, si vous multipliez SALES.COMMISSION, colonne DECIMAL(8,2) et SALES.QTYSOLD, colonne SMALLINT, le calcul est converti comme suit : 

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