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 ?

Était-ce utile?

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

LiveDemo

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.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top