2008-09-04 14 views
158

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:Tronquer (pas arrondi) des décimales dans SQL Server

declare @value decimal(18,2) 

set @value = 123.456 

Ceci arrondira automatiquement @Value à 123,46 .... ce qui dans la plupart des cas est bon. Cependant, pour ce projet, je n'ai pas besoin de ça. Existe-t-il un moyen simple de tronquer les décimales dont je n'ai pas besoin? Je sais que je peux utiliser la fonction left() et convertir en décimal ... d'autres façons?

Répondre

159
select round(123.456, 2, 1) 
-3
select convert(int,@value) 
+1

Ce n'est pas ce que l'OP voulait.Il veut toujours des décimales, mais il veut les supprimer (truncte) plutôt que de les arrondir. C'EST À DIRE. 123.456 -> 123.45 NOT 123.456 -> 12.46 et PAS 123.456 -> 123 – John

4

Voulez-vous que la décimale ou non?

Sinon, utilisez

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

Si vous le faites avec 0 puis faire un tour:

select round(@value,2) 
+1

Désolé si je n'étais pas clair, je dois garder les décimales, il suffit de laisser tomber celles que je ne veux pas. Par exemple, au lieu de 123.456 dans mon exemple ci-dessus étant converti en 123.46 ... Je veux laisser tomber la troisième décimale et le faire 123.45. –

209
ROUND (123.456 , 2 , 1) 

Lorsque le troisième paramètre = 0 tronque plutôt que ronds!

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

Syntaxe

ROND (numeric_expression, longueur [, fonction])

Arguments

  • numeric_expression est une expression des données numériques numériques exactes ou approximatives type de catégorie, à l'exception du type de données bit.

  • longueur Précision à laquelle l'expression numérique doit être arrondie. length doit être une expression de type tinyint, smallint ou int. Lorsque longueur est un nombre positif, expression_numérique est arrondie au nombre de positions décimales spécifiées par longueur. Lorsque longueur est un nombre négatif, expression_numérique est arrondie sur le côté gauche de la virgule décimale, comme spécifié par longueur.

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

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

+0

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

11

Voici la façon dont j'ai pu tronquer et non ronde:

select 100.0019-(100.0019%.001) 

retours 100.0010

Et votre exemple:

select 123.456-(123.456%.001) 

retourne 123.450

Maintenant, si vous voulez vous débarrasser du zéro, mettant fin à jeter simplement:

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

retours 123,45

5

Une autre tronquer sans solution d'arrondi et un 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 
+2

+1 pour 'Floor()' qui est le chemin à parcourir pour supprimer des décimales sans arrondir en effet. Dommage que Floor() n'a pas de second paramètre pour indiquer à quelle position. Mais je pense que le * 10)/10 fonctionne assez bien autour de cela. – deroby

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

S'il vous plaît 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

-3

Mod(x,1) est la meilleure façon que je pense.

+0

Pourquoi pensez-vous cela? –

7

ronde a un paramètre optionnel

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

Sélectionnez un tour (123.456, 2, 1) will = 123.450 – Bikram

+0

Je ne vois pas pourquoi cela devient upvotes. Ce qui précède vous donnera respectivement 123.450 et 123.460. –

0

Je pense que vous voulez que la valeur décimale, dans ce cas, vous pouvez utiliser les éléments suivants:

declare @val decimal (8, 3) 
SET @val = 123.456 

SELECT @val - ROUND(@val,0,1) 
3

Cela supprimera la partie décimale de tout numéro

SELECT ROUND(@val,0,1) 
+0

Ce n'est pas le cas. SELECT ROUND (123.4560,0,1) vous donne 123.0000 à la place. –

8

Actuellement, quel que soit le troisième paramètre, 0 ou 1 ou 2, il ne sera pas arrondir votre valeur.

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

Seul le tour ne fonctionne pas. Cast travaillé. Génial. –

+0

C'est le seul. Merci! –

+0

De toutes les réponses, c'est la bonne réponse. –

0

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 

LiveDemo

sortie:

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

Remarque:

Je recommande d'utiliser intégré ROUND fonction avec 3ème jeu de paramètres 1.

0

Je sais que c'est assez tard, mais je ne vois pas comme une réponse et ai utilisé cette astuce pour 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) 

retours 123,45

Il ajuste automatiquement l'arrondi à la valeur correcte que vous recherchez. Au fait, est-ce que vous recréerez le programme du film Office Space?