Tronquer (pas arrondir) les décimales dans SQL Server


194

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

Ce arrondit automatiquement @valued'ê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 la left()fonction et reconvertir en décimale. Y a-t-il d'autres moyens?

Réponses:


188
select round(123.456, 2, 1)

27
La réponse devrait expliquer quels sont les paramètres de la fonction
Tyler

9
SQL ROUND (nombre, décimales, opération): opération -> Si 0, il arrondit le résultat au nombre de décimales. Si une autre valeur que 0, elle tronque le résultat au nombre de décimales. La valeur par défaut est 0
Midhun Darvin

vous êtes un épargnant de vie, j'avais un montant à afficher uniquement les deux derniers chiffres "1.9991666", mais il arrondit toujours à 2, peu importe ce que j'utilise, avec cela, je suis en mesure de réaliser quelque chose comme ça - sélectionnez FORMAT (tour (1.9991666 , 2, 1), 'N2') AS 'Rate', Thanks mate
Spider

269
ROUND ( 123.456 , 2 , 1 )

Lorsque le troisième paramètre ! = 0, il tronque plutôt qu'arrondit

http://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx

Syntaxe

ROUND ( numeric_expression , length [ ,function ] )

Arguments

  • numeric_expression Expression de la catégorie de type de données numérique exacte ou approximative, à l'exception du type de données bit.

  • length Est la précision à laquelle expression_numérique doit être arrondie. longueur doit être une expression de type tinyint, smallint ou int. Lorsque la longueur est un nombre positif, expression_numérique est arrondie au nombre de positions décimales spécifiées par la longueur. Lorsque la longueur est un nombre négatif, expression_numérique est arrondie sur le côté gauche du séparateur décimal, comme spécifié par la longueur.

  • function Est le type d'opération à effectuer. la fonction doit être tinyint, smallint ou int. Lorsque la fonction est omise ou a une valeur de 0 (par défaut), expression_numérique est arrondie. Lorsqu'une valeur autre que 0 est spécifiée, expression_numérique est tronquée.

Quelqu'un sait-il quelles valeurs pour l'argument de fonction correspondent à tinyint, smallint et int? Microsoft a laissé cette partie de sa documentation et ne trouve la réponse nulle part. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave

MS SQL SERVER arrondit les nombres un peu différemment d'IQ. Pour corriger, utilisez la fonction ronde (x, y, z) comme cette ronde (val1 / val2,4,1)
Warren LaFrance

37
SELECT Cast(Round(123.456,2,1) as decimal(18,2))

13

Voici comment j'ai pu tronquer et non arrondir:

select 100.0019-(100.0019%.001)

renvoie 100,0010

Et votre exemple:

select 123.456-(123.456%.001)

renvoie 123,450

Maintenant, si vous voulez vous débarrasser du zéro final, il suffit de le lancer:

select cast((123.456-(123.456%.001)) as decimal (18,2))

renvoie 123,45


10

En fait, quel que soit le troisième paramètre, 0 ou 1 ou 2, il n’arrondira pas votre valeur.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))

Je ne comprends pas cette réponse. Le SQL donné donne 10.01, ce qui correspond à un arrondi correct de 10.0055 à deux décimales. Si le paramètre final n'est pas 0, la valeur est tronquée (à 2 décimales) à 10,00.
8128

7

Round a un paramètre facultatif

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46

3
Tour de sélection (123.456, 2, 1) = 123.450
Bikram

4
Je ne vois pas pourquoi cela fait monter les votes. Ce qui précède vous donnera respectivement 123.450 et 123.460.
remykarem

7

Voulez-vous la décimale ou non?

Sinon, utilisez

select ceiling(@value),floor(@value)

Si vous le faites avec 0, faites un tour:

select round(@value,2)

1
Désolé si je n'ai pas été clair, j'ai besoin de garder les décimales, il suffit de supprimer celles dont je ne veux pas. Par exemple, au lieu de 123.456 dans mon exemple ci-dessus étant converti en 123.46 ... Je veux supprimer la troisième décimale et la faire 123.45.
Ryan Eastabrook

6

Un autre tronqué sans solution ni exemple d'arrondi.

    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

2
+1 pour Floor()lequel est le chemin à parcourir pour supprimer des décimales sans arrondir en effet. Dommage que Floor () n'ait pas de second paramètre pour indiquer à quelle position. Mais je pense que le * 10) / 10 fonctionne très bien.
dérobie

4

Cela supprimera la partie décimale de tout nombre

SELECT ROUND(@val,0,1)

2
Ce ne est pas. SELECT ROUND (123.4560,0,1) vous donne 123.0000 à la place.
remykarem

2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Vous donnerait 2 valeurs après la virgule décimale. (SERVEUR MS SQL)


1

Une autre façon est la ODBC TRUNCATEfonction:

DECLARE @value DECIMAL(18,3) =123.456;

SELECT @value AS val, {fn TRUNCATE(@value, 2)} AS result

LiveDemo

Production:

╔═════════╦═════════╗
   val    result  
╠═════════╬═════════╣
 123,456  123,450 
╚═════════╩═════════╝

Remarque:

Je recommande d'utiliser la ROUNDfonction intégrée avec le 3e paramètre réglé sur 1.


1
Fonction scalaire ODBC - Alternative différente!
Arulmouzhi

1

Je sais que c'est assez tard mais je n'y vois pas de 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 à partir du film Office Space?


0

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


1) La 3e ligne est complètement inutile 2) il a explicitement dit qu'il ne voulait pas arrondir le nombre, mais le tronquer (le résultat devrait être 123,45)
Damián Pablo González

0

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)

0

Je sais que cette question est vraiment ancienne mais personne n'a utilisé de sous-chaînes pour arrondir. Ceci comme avantage la possibilité d'arrondir des nombres très longs (limite de votre chaîne dans SQL Server qui est généralement de 8000 caractères):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)

0

Je pense que nous pouvons aller beaucoup plus facilement avec un exemple de solution plus simple trouvé dans Hackerrank:

Énoncé du problème: recherchez la plus grande valeur des latitudes nord (LAT_N) dans STATION inférieure à 137,2345. Tronquez votre réponse à 4 décimales.

SELECT TRUNCATE(MAX(LAT_N),4)
FROM STATION
WHERE LAT_N < 137.23453;

La solution ci-dessus vous donne une idée de la façon de limiter la valeur à 4 décimales. Si vous souhaitez réduire ou augmenter les nombres après la décimale, remplacez simplement 4 par ce que vous voulez.


-3

Mod(x,1) est la façon la plus simple, je pense.


-5
select convert(int,@value)

1
Ce n'est pas ce que le PO voulait. Il veut toujours des décimales, mais il veut les supprimer (truncte) plutôt que de les arrondir. IE 123.456 -> 123.45 PAS 123.456 -> 12.46 et PAS 123.456 -> 123
John
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.