FirebirdSQL logo
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.