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.
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().
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.