- Catégories :
Fonctions numériques (arrondi et troncation)
ROUND¶
Renvoie des valeurs arrondies pour input_expr
.
- Voir aussi :
Syntaxe¶
ROUND( <input_expr> [ , <scale_expr> [ , <rounding_mode> ] ] )
Arguments¶
Obligatoire :
input_expr
Valeur ou expression sur laquelle opérer. Le type de données doit être l’un des types de données numériques, tels que FLOAT ou NUMBER.
Facultatif :
scale_expr
Nombre de chiffres que la sortie doit inclure après le point décimal. L’expression doit correspondre à un entier compris entre -38 et +38.
La valeur
scale_expr
par défaut est zéro, ce qui signifie que la fonction supprime tous les chiffres après le point décimal.Pour plus d’informations sur les nombres négatifs, voir les Notes sur l’utilisation ci-dessous.
rounding_mode
Le mode d’arrondi à utiliser. Vous pouvez spécifier l’une des valeurs suivantes :
'HALF_AWAY_FROM_ZERO'
. Ce mode arrondit la valeur à la moitié de zéro.'HALF_TO_EVEN'
. Ce mode arrondit la valeur à la moitié du nombre pair.
Par défaut :
'HALF_AWAY_FROM_ZERO'
Note
Si vous spécifiez l’une ou l’autre valeur pour l’argument
rounding_mode
, le type de données deinput_expr
doit être l’un des types de données pour un nombre à virgule fixe.Les types de données pour les nombres à virgule flottante (par exemple FLOAT) ne sont pas pris en charge avec cet argument.
Renvoie¶
Le type de retour est basé sur le type d’entrée :
Si l’entrée est FLOAT, alors le type de données de la valeur renvoyée est FLOAT.
Si l’entrée est NUMBER, alors le type de données de la valeur renvoyée est NUMBER.
Si l’échelle d’entrée est supérieure ou égale à zéro, l’échelle de sortie correspond généralement à l’échelle d’entrée.
Si l’échelle d’entrée est négative, l’échelle de sortie est 0.
Par exemple :
Le type de données renvoyé par ROUND(3.14::NUMBER(4, 1), 1) est NUMBER(4, 1).
Le type de données renvoyé par ROUND(3.14::NUMBER(4, 0), 0) est NUMBER(4, 0).
Si l’échelle est égale à zéro, la valeur est effectivement un entier.
Notes sur l’utilisation¶
Si
scale_expr
est négatif, alors il spécifie le nombre de positions avant le point décimal auquel le nombre doit être ajusté. Par exemple, si l’échelle est -2, le résultat est un multiple de 100.Si
scale_expr
est plus grand que l’échelle d’expression en entrée, la fonction n’a aucun effet.Si
input_expr
ouscale_expr
est NULL, le résultat est NULL.Par défaut, les demi-points sont arrondis à zéro pour les décimales. Par exemple, -0,5 est arrondi à -1,0.
Pour changer le mode d’arrondi afin d’arrondir la valeur à la moitié du nombre pair (par exemple, pour arrondir -0,5 à 0), passez en
'HALF_TO_EVEN'
pour l’argumentrounding_mode
.Note
Si vous spécifiez l’argument
rounding_mode
, le type de données de l’argumentinput_expr
doit être l’un des types de données pour un nombre à virgule fixe.Les nombres à virgule flottante sont des valeurs approximatives. Un nombre à virgule flottante pourrait ne pas s’arrondir comme prévu.
Si vous arrondissez le nombre pour l’amener en dehors de la plage de valeurs du type de données, une erreur est renvoyée.
Exemples¶
Ce premier exemple montre un exemple simple de ROUND
, avec le nombre de décimales par défaut (0) :
SELECT ROUND(135.135), ROUND(-975.975); +----------------+-----------------+ | ROUND(135.135) | ROUND(-975.975) | |----------------+-----------------| | 135 | -976 | +----------------+-----------------+
L’exemple suivant utilise une plage de valeurs pour le paramètre scale :
SELECT n, scale, ROUND(n, scale) FROM test_ceiling ORDER BY n, scale; +----------+-------+-----------------+ | N | SCALE | ROUND(N, SCALE) | |----------+-------+-----------------| | -975.975 | -1 | -980 | | -975.975 | 0 | -976 | | -975.975 | 2 | -975.98 | | 135.135 | -2 | 100 | | 135.135 | 0 | 135 | | 135.135 | 1 | 135.1 | | 135.135 | 3 | 135.135 | | 135.135 | 50 | 135.135 | | 135.135 | NULL | NULL | +----------+-------+-----------------+
L’exemple suivant montre la différence entre l’utilisation du mode d’arrondi par défaut ('HALF_AWAY_FROM_ZERO'
) et le mode d’arrondi 'HALF_TO_EVEN'
:
SELECT ROUND(2.5, 0), ROUND(2.5, 0, 'HALF_TO_EVEN'); +---------------+-------------------------------+ | ROUND(2.5, 0) | ROUND(2.5, 0, 'HALF_TO_EVEN') | |---------------+-------------------------------| | 3 | 2 | +---------------+-------------------------------+ SELECT ROUND(-2.5, 0), ROUND(-2.5, 0, 'HALF_TO_EVEN'); +----------------+--------------------------------+ | ROUND(-2.5, 0) | ROUND(-2.5, 0, 'HALF_TO_EVEN') | |----------------+--------------------------------| | -3 | -2 | +----------------+--------------------------------+
L’exemple suivant montre que les valeurs de FLOAT ne sont pas toujours stockées exactement. Comme vous pouvez le voir ci-dessous, dans certains cas, 0,005 est arrondi à 0,01, alors que dans d’autres cas, il est arrondi à 0. La différence n’est pas dans l’arrondi ; la différence est en réalité dans la représentation sous-jacente du nombre à virgule flottante ; 1,005 est stocké sous forme d’un nombre très légèrement inférieur à 1,005 (environ 1,004999). La valeur DECIMAL est toutefois stockée sous forme de nombre exact et est arrondie à 0,01 comme prévu dans tous les cas.
Créer et charger une table :
CREATE OR REPLACE TEMP TABLE rnd1(f float, d DECIMAL(10, 3)); INSERT INTO rnd1 (f, d) VALUES ( -10.005, -10.005), ( -1.005, -1.005), ( 1.005, 1.005), ( 10.005, 10.005) ;Montrer des exemples de différence entre les valeurs arrondies FLOAT et les valeurs arrondies DECIMAL :
select f, round(f, 2), d, round(d, 2) from rnd1 order by 1; +---------+-------------+---------+-------------+ | F | ROUND(F, 2) | D | ROUND(D, 2) | |---------+-------------+---------+-------------| | -10.005 | -10.01 | -10.005 | -10.01 | | -1.005 | -1 | -1.005 | -1.01 | | 1.005 | 1 | 1.005 | 1.01 | | 10.005 | 10.01 | 10.005 | 10.01 | +---------+-------------+---------+-------------+