Tronquer (et non arrondir) les décimales dans SQL Server
-
09-06-2019 - |
Question
J'essaie de déterminer la meilleure façon de tronquer ou de supprimer des décimales supplémentaires dans SQL sans arrondir.Par exemple:
declare @value decimal(18,2)
set @value = 123.456
Cela arrondira automatiquement @value
être 123.46
, ce qui est bon dans la plupart des cas.Cependant, pour ce projet, je n’en ai pas besoin.Existe-t-il un moyen simple de tronquer les décimales dont je n'ai pas besoin ?Je sais que je peux utiliser le left()
fonction et reconvertir en décimal.Existe-t-il d'autres moyens ?
La solution
select round(123.456, 2, 1)
Autres conseils
ROUND ( 123.456 , 2 , 1 )
Lorsque le troisième paramètre != 0 il tronque plutôt qu'arrondi
http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Syntaxe
ROND ( expression_numérique , longueur [ ,fonction ] )
Arguments
expression_numériqueEst une expression de la catégorie de type de données numériques numérique ou approximative exacte, à l'exception du type de données de bits.
longueurEst la précision avec laquelle numeric_expression doit être arrondie.length doit être une expression de type tinyint, smallint ou int.Lorsque length est un nombre positif, numeric_expression est arrondi au nombre de positions décimales spécifié par length.Lorsque length est un nombre négatif, expression_numérique est arrondie à gauche de la virgule décimale, comme spécifié par length.
- fonctionC'est le type d'opération à effectuer.la fonction doit être tinyint, smallint ou int.Lorsque la fonction est omise ou a la valeur 0 (par défaut), l'expression_numérique est arrondie.Lorsqu'une valeur autre que 0 est spécifiée, numeric_expression est tronquée.
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
Voici comment j'ai pu tronquer et non arrondir :
select 100.0019-(100.0019%.001)
renvoie 100,0010
Et ton exemple :
select 123.456-(123.456%.001)
renvoie 123.450
Maintenant, si vous voulez vous débarrasser du zéro final, lancez-le simplement :
select cast((123.456-(123.456%.001)) as decimal (18,2))
renvoie 123,45
En fait, quel que soit le troisième paramètre, 0, 1 ou 2, il n'arrondira pas votre valeur.
CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Round a un paramètre facultatif
Select round(123.456, 2, 1) will = 123.45
Select round(123.456, 2, 0) will = 123.46
Un autre tronqué sans solution d'arrondi ni exemple.
Convert 71.950005666 to a single decimal place number (71.9)
1) 71.950005666 * 10.0 = 719.50005666
2) Floor(719.50005666) = 719.0
3) 719.0 / 10.0 = 71.9
select Floor(71.950005666 * 10.0) / 10.0
Tu veux la décimale ou pas ?
Sinon, utilisez
select ceiling(@value),floor(@value)
Si vous le faites avec 0 alors faites un tour :
select round(@value,2)
Cela supprimera la partie décimale de n'importe quel nombre
SELECT ROUND(@val,0,1)
Je sais que c'est assez tard mais je ne vois pas cela comme une réponse et j'utilise cette astuce depuis des années.
Soustrayez simplement 0,005 de votre valeur et utilisez Round (@num,2).
Votre exemple :
declare @num decimal(9,5) = 123.456
select round(@num-.005,2)
renvoie 123,45
Il ajustera automatiquement l’arrondi à la valeur correcte que vous recherchez.
Au fait, recréez-vous le programme du film Office Space ?
Veuillez essayer d'utiliser ce code pour convertir 3 valeurs décimales après un point en 2 décimales :
declare @val decimal (8, 2)
select @val = 123.456
select @val = @val
select @val
La sortie est 123,46
Je pense que vous ne voulez que la valeur décimale, dans ce cas, vous pouvez utiliser ce qui suit:
declare @val decimal (8, 3)
SET @val = 123.456
SELECT @val - ROUND(@val,0,1)
Une autre façon est ODBC TRUNCATE
fonction:
DECLARE @value DECIMAL(18,3) =123.456;
SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result
Sortir:
╔═════════╦═════════╗
║ val ║ result ║
╠═════════╬═════════╣
║ 123,456 ║ 123,450 ║
╚═════════╩═════════╝
Remarque:
Je recommande d'utiliser le module intégré ROUND
fonction avec le 3ème paramètre réglé à 1.
Je sais que cette question est vraiment ancienne mais personne n'a utilisé de sous-chaînes pour arrondir.Cela a comme avantage la possibilité d'arrondir des nombres très longs (limite de votre chaîne dans le serveur SQL qui est généralement de 8 000 caractères) :
SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
select convert(int,@value)
Mod(x,1)
c'est le moyen le plus simple, je pense.