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?

Ryan Eastabrook
la source

Réponses:

188
select round(123.456, 2, 1)
Jimmy
la source
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.
Jeff Cuscutis
la source
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))
qch
la source
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

qch
la source
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))
I have
la source
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
Quentin
la source
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)
SQLMenace
la source
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
James
la source
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)
Probal
la source
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)

Dawood Zaidi
la source
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.

Lukasz Szozda
la source
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?

KeithL
la source
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

qch
la source
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)
Mohamed
la source
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)
tukan
la source
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.

Ishwor Bhusal
la source
-3

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

qch
la source
-5
select convert(int,@value)
SQLMenace
la source
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