ROUND |
Arrondir |
---|---|
SAS | Tronquer |
Syntaxe
ROUND(argument<,RoundingUnit>) |
Paramètres
Nom | Description |
---|---|
argument | Ce paramètre permet d'indiquer le nombre à arrondir. |
RoundingUnit | Ce paramètre permet d'indiquer l'unité d'arrondissement à retourner. |
Description
Cette fonction arrondie une valeur avec une unité d'arrondissement spécifié.
Remarques
- Concepts de base : La fonction ROUND arrondit le premier paramètre à une valeur très proche d'un multiple du deuxième paramètre. Le résultat peut ne pas être un multiple exact du deuxième paramètre.
- Différences entre l'arithmétique binaire et décimale : Les ordinateurs utilisent l'arithmétique binaire avec une précision finie. Si vous travaillez avec des nombres n'ayant pas une représentation binaire exacte, les ordinateurs produisent souvent des résultats légèrement différents de ceux obtenus avec l'arithmétique décimale.
- Les effets de l'arrondi : L'arrondi par définition trouve un multiple exact de l'unité d'arrondi étant le plus proche de la valeur à arrondir. Par exemple, 0,33 arrondi au dixième le plus proche est égal à 3*0,1 ou 0,3 en arithmétique décimale. En arithmétique binaire, 0,33 arrondi au dixième le plus proche est égal à 3*0,1 et non 0,3, car 0,3 n'est pas un multiple exact d'un dixième en arithmétique binaire. La fonction ROUND renvoie la valeur basée sur l'arithmétique décimale, même si cette valeur n'est parfois pas le résultat exact et mathématiquement correct. Dans l'exemple ROUND(0.33.0.1), ROUND renvoie 0.3 et non 3*0.1.
- Exprimer des valeurs binaires : Si les caractères "0.3" apparaissent comme une constante dans un programme SAS, la valeur est calculée par l'informat standard comme 3/10. Pour être cohérent avec l'informat standard, ROUND(0.33.0.1) calcule le résultat comme 3/10, et l'instruction suivante produit les résultats que vous attendez :
- Test d'égalité approximative : Vous ne devez pas utiliser la fonction ROUND comme méthode générale pour tester l'égalité approximative. Deux
nombres ne différant que par le bit le moins significatif peuvent arrondir à des valeurs différentes si un nombre arrondit vers le bas et l'autre nombre arrondi vers le haut.
Le test d'égalité approximative dépend de la façon dont les nombres ont été calculés. Si les deux nombres sont calculés avec une précision relative élevée, vous pouvez tester
l'égalité approximative en utilisant les fonctions ABS et MAX, comme le montre l'exemple suivant :
if abs(x-y) <= 1e-12 * max( abs(x), abs(y) ) then
/* ... plus d'instructions SAS ... */
- Produire les résultats attendus : En général, ROUND(argument, rounding-unit) produit le résultat que vous attendez de l'arithmétique décimale si le résultat n'a pas plus de neuf chiffres significatifs et que l'une des conditions suivantes est vraie : l'unité d'arrondi est un entier, l'unité d'arrondi est une puissance de 10 supérieure ou égale à 1e-15 (si l'unité d'arrondi est inférieure à un, ROUND la traite comme une puissance de 10 si l'inverse de l'unité d'arrondi diffère d'une puissance de 10 dans au plus les trois ou quatre bits les moins significatifs) ou le résultat que vous attendez de l'arithmétique décimale n'a pas plus de quatre décimales.
if round(x,0.1) = 0.3 then
/* ... plus d'instructions SAS ... */
Cependant, si vous utilisez la variable Y au lieu de la constante 0,3, comme le montre l'instruction suivante, les résultats peuvent être inattendus selon la façon dont la variable Y est calculée :
if round(x,0.1) = y then
/* ... plus d'instructions SAS ... */
Si SAS lit Y comme caractères "0.3" en utilisant l'informat standard, le résultat est le même que si une constante 0.3 apparaissait dans l'instruction IF. Si SAS lit Y avec un informat différent, ou si un programme autre que SAS lit Y, alors il n'y a aucune garantie que les caractères "0.3" produiront une valeur d'exactement 3/10. L'imprécision peut également être causée par le calcul impliquant des nombres qui n'ont pas de représentations binaires exactes, ou par le portage d'ensembles de données d'un environnement d'exploitation à un autre qui a une représentation à virgule flottante différente. Si vous savez que Y est un nombre décimal avec une décimale, mais que vous n'êtes pas certain que Y a exactement la même valeur que celle produite par l'informat standard, il est préférable d'utiliser l'instruction suivante :
if round(x,0.1) = round(y,0.1) then
/* ... plus d'instructions SAS ... */
Exemple
Voici un exemple de l'utilisation de cette fonction :
- data roundsamples;
- x = round(1);
- put 'Round(1)=' x;
- x = round(1.1,1.1);
- put 'Round(1.1,1.1)=' x;
- x = round(1.7,1.7);
- put 'Round(1.7,1.7)=' x;
- x = round(-1,1.0);
- put 'Round(-1,1.0)=' x;
- x = round(-1.1,1.0);
- put 'Round(-1.1,1.0)=' x;
- x = round(-1.7,1.0);
- put 'Round(-1.7,1.0)=' x;
- x = round(30.2);
- put 'Round(30.2)=' x;
- x = round(-35.4);
- put 'Round(-35.4)=' x;
- x = round(-345.6789,345.67);
- put 'Round(-345.6789,2)=' x;
- run;
on obtiendra le résultat suivant :
Round(1)=1Round(1.1,1.1)=1.1
Round(1.7,1.7)=1.7
Round(-1,1.0)=-1
Round(-1.1,1.0)=-1
Round(-1.7,1.0)=-2
Round(30.2)=30
Round(-35.4)=-35
Round(-345.6789,2)=-345.67