FirebirdSQL logo
 Structure du langage SQLÉléments communs du langage 
DECFLOAT et fonctions
Utilisation des fonctions conventionnelles

Un certain nombre de fonctions scalaires standard peuvent être utilisées avec des expressions et des valeurs de type DECFLOAT.Cela s’applique aux fonctions mathématiques suivantes :

ABS

CEILING

EXP

FLOOR

LN

LOG

LOG10

POWER

SIGN

SQRT

Les fonctions d’agrégation SUM, AVG, MIN et MAX fonctionnent également avec le type DECFLOAT.Toutes les fonctions d’agrégation statistique (telles que, mais sans s’y limiter, STDDEV ou CORR) peuvent traiter des données de type DECFLOAT.

Fonctions spéciales pour `DECFLOAT

Firebird supporte 4 fonctions qui sont conçues spécifiquement pour supporter le type DECFLOAT :

COMPARE_DECFLOAT

compare deux valeurs DECFLOAT comme étant égales, différentes ou non ordonnées.

NORMALIZE_DECFLOAT

prend un seul argument DECFLOAT et le retourne sous sa forme la plus simple.

QUANTIZE

prend deux arguments DECFLOAT et retourne le premier argument mis à l’échelle en utilisant la deuxième valeur comme échantillon.

TOTALORDER

effectue une comparaison exacte de deux valeurs DECFLOAT.

Sémantique de la comparaison

Les zéros en fin des valeurs décimales en virgule flottante sont conservés.Par exemple, 1,0 et 1,00 sont deux représentations différentes.Cela génère une sémantique de comparaison différente pour le type de données DECFLOAT, comme indiqué ci-dessous.

Comparaison des valeurs numériques

Les zéros de fin sont ignorés dans les comparaisons.Par exemple, 1,0 est égal à 1,00.Par défaut, ce type de comparaison est utilisé pour l’indexation, le tri, le partitionnement des tables, l’évaluation des prédicats et d’autres fonctions — en bref, partout où la comparaison est effectuée implicitement ou dans les prédicats.

Example 1. Comparaison des valeurs numériques
create table stockPrice (stock DECFLOAT(16));

insert into stockPrice
values (4.2);

insert into stockPrice
values (4.2000);

insert into stockPrice
values (4.6125);

insert into stockPrice
values (4.20);

commit;

select * from stockPrice where stock = 4.2;
-- Renvoie trois valeurs 4.2, 4.2000, 4.20

select * from stockPrice where stock > 4.20;
-- Retourne une valeur 4.6125

select * from stockPrice order by stock;
-- Retourne toutes les valeurs, 4.2, 4.2000, 4.20, 4.6125.
-- Les trois premières valeurs sont renvoyées dans un ordre indéfini.
Comparaison TotalOrder

Les zéros de queue sont pris en compte dans la comparaison.Par exemple, 1,0 > 1,00.Chaque valeur DECFLOAT a un ordre dans la sémantique de comparaison TotalOrder.

Selon la sémantique TotalOrder, l’ordre des différentes valeurs est déterminé comme le montre l’exemple suivant :

-nan < -snan < -inf < -0.1 < -0.10 < -0 < 0 < 0.10 < 0.1 < inf < snan < nan
Important

Notez qu’un zéro négatif est inférieur à un zéro positif lors de la comparaison. TotalOrder

Vous pouvez demander une comparaison TotalOrder dans les prédicats en utilisant la fonction intégrée TOTALORDER().

Example 2. Comparaison TotalOrder

Pour les prix des actions, il peut être important de connaître l’exactitude des données.Par exemple, si les taux sont généralement indiqués avec cinq décimales et que le taux est de 4,2 $, il n’est pas clair si le prix est de 4,2000 $, 4,2999 $ ou quelque chose se situant entre ces deux valeurs.

create table stockPrice (stock DECFLOAT(16));

insert into stockPrice
values (4.2);

insert into stockPrice
values (4.2000);

insert into stockPrice
values (4.6125);

insert into stockPrice
values (4.20);

commit;

select * from stockPrice where TOTALORDER(stock, 4.2000) = 0;
-- Renvoie uniquement la valeur 4.2000

select * from stockPrice where TOTALORDER(stock, 4.20) = 1;
-- Renvoie deux valeurs 4.2 et 4.6125, ce qui est supérieur à 4.20

L’ordre dans lequel sont renvoyées des valeurs arithmétiques identiques comportant un nombre différent de zéros de fin n’est pas défini.Ainsi, ORDER BY par la colonne DECFLOAT avec les valeurs 1.0 et 1.00 renvoie deux valeurs dans un ordre aléatoire.De même, DISTINCT renvoie soit 1.0 soit 1.00.

Support dans les applications clients

La bibliothèque fbclient version 4.0 a un support natif pour le type DECFLOAT.Cependant, les anciennes versions de la bibliothèque client ne connaissent pas le type DECFLOAT.Pour que les applications plus anciennes puissent gérer le type DECFLOAT, vous pouvez configurer le mappage des valeurs DECFLOAT vers d’autres types de données disponibles en utilisant l’attribut SET BIND.

Exemples:
SET BIND OF DECFLOAT TO LEGACY;
-- Les valeurs des colonnes de type DECFLOAT seront converties en type DOUBLE PRECISION.

-- une autre option
SET BIND OF DECFLOAT TO DOUBLE PRECISION;

SET BIND OF DECFLOAT(16) TO CHAR;
-- Les valeurs de colonne de DECFLOAT(16) seront converties en CHAR(23).

SET BIND OF DECFLOAT(34) TO CHAR;
-- Les valeurs de colonne de DECFLOAT(34) seront converties en CHAR(42).

SET BIND OF DECFLOAT TO NUMERIC(18, 4);
-- Les valeurs des colonnes de DECFLOAT seront converties en NUMERIC(18, 4).

SET BIND OF DECFLOAT TO NATIVE;
-- Retourne les valeurs des colonnes de type DECFLOAT en type natif

Les différentes liaisons sont utiles si vous prévoyez d’utiliser des valeurs DECFLOAT avec un ancien client qui ne supporte pas son propre format.Vous pouvez choisir entre des chaînes de caractères (précision parfaite, mais mauvaise prise en charge du traitement ultérieur), des valeurs à virgule flottante (prise en charge parfaite du traitement ultérieur, mais mauvaise précision) ou des nombres entiers mis à l’échelle (bonne prise en charge du traitement ultérieur et précision requise, mais plage de valeurs très limitée). Lorsqu’un outil tel que le client GUI universel est utilisé, le choix de la liaison à CHAR est approprié dans la plupart des cas.

Types de données à virgule fixe

Ces types de données permettent de les utiliser pour stocker des valeurs monétaires et fournissent une prévisibilité pour les opérations de multiplication et de division.

Firebird propose deux types de données à virgule fixe : NUMERIC et DECIMAL.Selon la norme, les deux types limitent le nombre stocké à une échelle déclarée (le nombre de décimales).Cependant, l’approche de la contrainte de précision est différente pour les types : pour les colonnes NUMERIC, la précision est aussi quedéclaré", tandis que les colonnes `DECIMAL peuvent recevoir des nombres dont la précision est au moins égale à ce qui a été déclaré.

Par exemple, NUMERIC(4, 2) décrit un nombre composé d’un total de quatre chiffres dont 2 chiffres après la virgule ; total 2 chiffres avant la virgule, 2 après.Si vous écrivez une valeur de 3.1415 dans une colonne avec ce type de données, la colonne NUMERIC(4, 2) conservera la valeur 3.14.

Pour les données à virgule fixe, ce qui est commun est la forme de la déclaration, par exemple NUMERIC(p, s). Ce qu’il faut comprendre ici, c’est que dans cette entrée, "est l’échelle, et non le "nombre de décimales" intuitivement prévu.Pour "visualiser" le mécanisme de stockage des données, mémorisez vous-même la procédure :

  • Lors de la sauvegarde dans la base de données, le nombre est multiplié par 10 (10s), ce qui le transforme en un nombre entier ;

  • Lorsque les données sont lues, le nombre est reconverti en un nombre entier.

La manière dont les données sont physiquement stockées dans le SGBD dépend de plusieurs facteurs : la précision déclarée, le dialecte de la base de données et le type de déclaration.

Table 1. Une façon de stocker physiquement des nombres à virgule fixe
Précision Type de données Dialecte 1 Dialecte 3

1 - 4

NUMERIC

SMALLINT

SMALLINT

1 - 4

DECIMAL

INTEGER

INTEGER

5 - 9

NUMERIC ou DECIMAL

INTEGER

INTEGER

10 - 18

NUMERIC ou DECIMAL

DOUBLE PRECISION

BIGINT

19 - 38

NUMERIC ou DECIMAL

INT128

INT128