FirebirdSQL logo

DECIMAL

Format déclarative des données
  DECIMAL
| DECIMAL(precision)
| DECIMAL(precision, scale)
Table 1. Paramètres de type DECIMAL
Paramètre ^^ Description

precision

Précision. Peut être compris entre 1 et 38.Le paramètre par défaut est 9.

scale

Scale. Peut aller de 0 à précision.Le paramètre par défaut est 0.

Le format de stockage de la base de données est largement similaire à celui de `NUMERIC', bien qu’il y ait certaines caractéristiques qui sont plus faciles à expliquer avec un exemple.

Voici des exemples de la manière dont la base de données stocke les données en fonction de la manière dont elles sont déclarées :

DECIMAL(4)    stored as   INTEGER (exact data)
DECIMAL(4,2)              INTEGER (data * 102)
DECIMAL(10,4) (Dialect 1) DOUBLE PRECISION
              (Dialect 3) BIGINT (data * 104)
DECIMAL(38, 6)            INT128 (data * 106)

Précision des opérations arithmétiques

Les fonctions MIN, MAX, SUM, AVG fonctionnent avec tous les types numériques exacts.SUM et AVG sont exacts si l’entrée traitée est de type numérique exact et que la somme mise à l’échelle correspond à 64 ou 128 bits : sinon une exception de débordement se produit.SUM et AVG ne sont jamais calculés en utilisant l’arithmétique à virgule flottante, sauf si le type de données de la colonne est un nombre approximatif.

Les fonctions MIN et MAX pour une colonne numérique exacte retournent un résultat numérique exact avec la même précision et la même échelle que la colonne.SUM et AVG pour un type numérique exact retourne un résultat de type NUMERIC ({18 | 38}, S) ou DECIMAL ({18 | 38}, S) où S est l’échelle de la colonne.La norme SQL définit l’échelle du résultat dans de tels cas, tandis que la précision de SUM ou AVG pour les colonnes à virgule fixe est définie par l’implémentation : nous la définissons comme 18 ou 38 (si la précision de l’argument est 18 ou 38).

Si les deux opérandes OP1 et OP2 sont des nombres exacts d’échelle S1 et S2 respectivement, alors OP1 + OP2 et OP1 - OP2 sont des nombres exacts de précision 18 ou 38 (si l’un des arguments est de précision 38) et d’échelle égale au plus grand de S1 et S2, alors que pour OP1 * OP2 et OP1 / OP2 sont des nombres exacts de précision 18 ou 38 (si les arguments sont de précision 18 ou 38) et d’échelle S1 + S2.Les échelles de ces opérations, sauf la division, sont définies par la norme SQL.La précision de toutes ces opérations et les échelles de division ne sont pas régies par la norme, mais sont définies par l’implémentation : Firebird définit la précision comme 18 ou 38 (si la précision de l’argument est 18 ou 38) et les échelles de division comme S1 + S2, les mêmes que celles définies par la norme pour la multiplication.

Lorsque des opérations arithmétiques sont effectuées sur des types numériques exacts, une erreur de dépassement sera signalée si la précision est perdue, plutôt que de renvoyer une valeur incorrecte. Par exemple, si la colonne DECIMAL (18,4) contient la valeur la plus négative de ce type, à savoir -922337203685477.5808, une tentative de division de cette colonne par -1 signalera une erreur de débordement car le résultat réel dépasse la plus grande valeur positive pouvant être représentée dans le type, à savoir 922337203685477.5807.

Si l’un des opérandes est un nombre exact et l’autre un nombre approximatif, le résultat de l’un des quatre opérateurs dyadiques sera de type DOUBLE PRECISION'.(La norme stipule que le résultat est un nombre approximatif avec au moins la même précision que l’opérande numérique approximatif : Firebird satisfait à cette exigence en utilisant toujours `DOUBLE PRECISION, puisque ce type est le type numérique approximatif maximum que Firebird fournit).