Truncar (no redondear) lugares decimales en SQL Server

194

Estoy tratando de determinar la mejor manera de truncar o soltar lugares decimales adicionales en SQL sin redondear. Por ejemplo:

declare @value decimal(18,2)

set @value = 123.456

Esto se redondeará automáticamente @valuepara ser 123.46, lo cual es bueno en la mayoría de los casos. Sin embargo, para este proyecto, no necesito eso. ¿Hay una manera simple de truncar los decimales que no necesito? Sé que puedo usar la left()función y volver a convertir a un decimal. ¿Hay otras maneras?

Ryan Eastabrook
fuente

Respuestas:

188
select round(123.456, 2, 1)
Palanqueta
fuente
27
La respuesta debería explicar cuáles son los parámetros de la función
Tyler
9
SQL ROUND (número, decimales, operación): operación -> Si 0, redondea el resultado al número de decimales. Si otro valor que no sea 0, trunca el resultado a la cantidad de decimales. El valor predeterminado es 0
Midhun Darvin el
eres un salvavidas, tenía una cantidad para mostrar los últimos dos dígitos solo "1.9991666", sin embargo, siempre se redondea a 2 sin importar lo que use, con esto puedo lograr algo como esto: seleccione FORMATO (redondo (1.9991666 , 2, 1), 'N2') AS 'Rate', Gracias amigo
Spider
269
ROUND ( 123.456 , 2 , 1 )

Cuando el tercer parámetro ! = 0 se trunca en lugar de redondear

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

Sintaxis

ROUND ( numeric_expression , length [ ,function ] )

Argumentos

  • numeric_expression Es una expresión de la categoría de tipo de datos numérico exacto o aproximado, excepto el tipo de datos de bit.

  • length Es la precisión a la que se debe redondear numeric_expression. length debe ser una expresión de tipo tinyint, smallint o int. Cuando la longitud es un número positivo, numeric_expression se redondea al número de posiciones decimales especificadas por la longitud. Cuando la longitud es un número negativo, numeric_expression se redondea en el lado izquierdo del punto decimal, según lo especificado por la longitud.

  • function Es el tipo de operación a realizar. la función debe ser tinyint, smallint o int. Cuando se omite la función o tiene un valor de 0 (predeterminado), numeric_expression se redondea. Cuando se especifica un valor distinto de 0, numeric_expression se trunca.
Jeff Cuscutis
fuente
¿Alguien sabe qué valores para el argumento de función corresponden a tinyint, smallint e int? Microsoft dejó esa parte de su documentación y no puede encontrar la respuesta en ningún lado. msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx
Dave
MS SQL SERVER redondea los números de forma un poco diferente a IQ. Para solucionarlo, use la función round (x, y, z) como esta ronda (val1 / val2,4,1)
Warren LaFrance
37
SELECT Cast(Round(123.456,2,1) as decimal(18,2))
algo
fuente
13

Esta es la forma en que pude truncar y no redondear:

select 100.0019-(100.0019%.001)

devuelve 100.0010

Y tu ejemplo:

select 123.456-(123.456%.001)

devuelve 123.450

Ahora, si quieres deshacerte del cero final, simplemente lánzalo:

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

devuelve 123.45

algo
fuente
10

En realidad, sea cual sea el tercer parámetro, 0 o 1 o 2, no redondeará su valor.

CAST(ROUND(10.0055,2,0) AS NUMERIC(10,2))
Jai
fuente
No entiendo esta respuesta. El SQL dado da como resultado 10.01, que es un redondeo correcto de 10.0055 a dos decimales. Si el parámetro final no es 0, el valor se trunca (a 2 decimales) a 10.00.
8128
7

Round tiene un parámetro opcional

Select round(123.456, 2, 1)  will = 123.45
Select round(123.456, 2, 0)  will = 123.46
Quentin
fuente
3
Seleccionar ronda (123.456, 2, 1) will = 123.450
Bikram
44
No veo por qué esto recibe votos positivos. Lo anterior le dará 123.450 y 123.460 respectivamente.
remykarem
7

¿Quieres el decimal o no?

Si no, use

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

Si lo haces con 0, haz una ronda:

select round(@value,2)
SQLMenace
fuente
1
Lo siento si no estaba claro, necesito mantener los lugares decimales, simplemente elimine los que no quiero. Por ejemplo, en lugar de 123.456 en mi ejemplo anterior convertido a 123.46 ... Quiero soltar el tercer decimal y hacerlo 123.45.
Ryan Eastabrook
6

Otro truncado sin solución de redondeo y ejemplo.

    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
fuente
2
+1 para lo Floor()cual es el camino a seguir para soltar decimales sin redondear de hecho. Lástima que Floor () no tenga un segundo parámetro para indicar en qué posición. Pero creo que el * 10) / 10 funciona bastante bien alrededor de esto.
deroby
4

Esto eliminará la parte decimal de cualquier número.

SELECT ROUND(@val,0,1)
Probal
fuente
2
No es asi. SELECCIONAR RONDA (123.4560,0,1) le da 123.0000 en su lugar.
remykarem
2
SELECT CAST(Value as Decimal(10,2)) FROM TABLE_NAME;

Te daría 2 valores después del punto decimal. (SERVIDOR MS SQL)

Dawood Zaidi
fuente
1

Otra forma es la ODBC TRUNCATEfunción:

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

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

LiveDemo

Salida:

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

Observación:

Recomiendo usar la ROUNDfunción incorporada con el tercer parámetro configurado en 1.

Lukasz Szozda
fuente
1
Función escalar ODBC - ¡Otra alternativa!
Arulmouzhi
1

Sé que esto es bastante tarde, pero no lo veo como una respuesta y he estado usando este truco durante años.

Simplemente reste .005 de su valor y use Round (@ num, 2).

Su ejemplo:

declare @num decimal(9,5) = 123.456

select round(@num-.005,2)

devuelve 123.45

Ajustará automáticamente el redondeo al valor correcto que está buscando.

Por cierto, ¿estás recreando el programa de la película Office Space?

KeithL
fuente
0

Intente utilizar este código para convertir 3 valores decimales después de un punto en 2 decimales:

declare @val decimal (8, 2)
select @val = 123.456
select @val =  @val

select @val

La salida es 123.46

algo
fuente
1) la tercera línea es completamente innecesaria 2) dijo explícitamente que no quería redondear el número, pero truncarlo (el resultado debería ser 123.45)
Damián Pablo González
0

Creo que solo quieres el valor decimal, en este caso puedes usar lo siguiente:

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

SELECT @val - ROUND(@val,0,1)
Mohamed
fuente
0

Sé que esta pregunta es muy antigua, pero nadie usó subcadenas para redondear. Esto como ventaja es la capacidad de redondear números realmente largos (límite de su cadena en el servidor SQL que generalmente es de 8000 caracteres):

SUBSTRING('123.456', 1, CHARINDEX('.', '123.456') + 2)
tukan
fuente
0

Creo que podemos ser mucho más fáciles con una solución de ejemplo más simple que se encuentra en Hackerrank:

Planteamiento del problema: Consulte el valor más grande de las Latitudes del Norte (LAT_N) desde STATION que sea menor que 137.2345. Trunca tu respuesta a 4 decimales.

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

La solución anterior le da una idea de cómo limitar el valor a 4 puntos decimales. Si desea bajar o subir los números después del decimal, simplemente cambie 4 a lo que quiera.

Ishwor Bhusal
fuente
-3

Mod(x,1) Es la forma más fácil que pienso.

algo
fuente
-5
select convert(int,@value)
SQLMenace
fuente
1
Esto no es lo que quería el OP. Todavía quiere decimales, pero quiere eliminarlos (truncte) en lugar de redondearlos. IE 123.456 -> 123.45 NO 123.456 -> 12.46 y NO 123.456 -> 123
John