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.