2008-09-04 18 views
158

Estoy tratando de determinar la mejor forma de truncar o eliminar decimales adicionales en SQL sin redondear. Por ejemplo:Lugares decimales truncados (no redondos) en SQL Server

declare @value decimal(18,2) 

set @value = 123.456 

Este auto voluntad redonda @Valor para ser .... 123.46, que en la mayoría de los casos es bueno. Sin embargo, para este proyecto no necesito eso. ¿Hay una manera simple de truncar los decimales que no necesito? Sé que puedo usar la función left() y convertir de nuevo a un decimal ... de alguna otra manera?

Respuesta

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

Esto no es lo que el OP quería.Todavía quiere decimales, pero quiere eliminarlos (truncte) en lugar de redondearlos. ES DECIR. 123.456 -> 123.45 NO 123.456 -> 12.46 y NO 123.456 -> 123 – John

4

¿Quieres que el decimal o no?

Si no es así, utilice

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

Si lo haces con 0 y luego hacer una ronda:

select round(@value,2) 
+1

Disculpe si no estaba claro, necesito mantener los decimales, solo deje caer los que no quiero. Por ejemplo, en lugar de 123.456 en mi ejemplo anterior que se convierte en 123.46 ... quiero soltar el tercer decimal y hacerlo 123.45. –

209
ROUND (123.456 , 2 , 1) 

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

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

Sintaxis

ROUND (numeric_expression, longitud [, la función])

Argumentos

  • numeric_expression es una expresión de los datos numéricos exacto o numérico aproximado tipo de categoría, excepto para el tipo de datos de bit.

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

  • función Es el tipo de operación a realizar. la función debe ser tinyint, smallint o int. Cuando la función se omite o tiene un valor de 0 (predeterminado), numeric_expression se redondea. Cuando se especifica un valor distinto de 0, numeric_expression se trunca.
+0

¿Alguien sabe qué valores para el argumento de la función corresponden a tinyint, smallint e int? Microsoft dejó esa parte fuera de su documentación y no puede encontrar la respuesta en ningún lado. https://msdn.microsoft.com/en-us/library/ms175003(SQL.90).aspx – Dave

+0

MS SQL SERVER redondea los números de forma un poco diferente a IQ. Para solucionarlo, utilice la función de redondeo (x, y, z) como redondo (val1/val2,4,1) –

11

Ésta es la forma en que era capaz de truncar y no redondos:

select 100.0019-(100.0019%.001) 

vuelve 100.0010

Y tu ejemplo:

select 123.456-(123.456%.001) 

retornos 123.450

Ahora si usted quiere deshacerse del cero fin, simplemente echarlo:

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

vuelve 123.45

5

Otra truncar sin solución de redondeo y el 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 
+2

+1 para 'Piso()', que es la manera de ir a colocar decimales sin redondear. Muy mal Floor() no tiene un segundo parámetro para indicar en qué posición. Pero creo que el * 10)/10 funciona bastante bien. – deroby

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

Por favor, intente utilizar este código para la conversión de 3 valores decimales después de un punto a 2 decimales:

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

select @val 

La salida es 123.46

-3

Mod(x,1) es la manera más fácil que pensar.

+0

¿Por qué piensas eso? –

7

Ronda tiene un parámetro opcional

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

Seleccionar ronda (123.456, 2, 1) will = 123.450 – Bikram

+0

No veo por qué esto se levanta votos. Lo anterior te dará 123.450 y 123.460 respectivamente. –

0

Creo que sólo desea que el valor decimal, en este caso, puede utilizar el siguiente:

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

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

Esto eliminará la parte decimal de cualquier número

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

No es así. SELECCIONAR REDONDO (123.4560,0,1) le da 123.0000 en su lugar. –

8

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

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

Solo ronda no funciona. El reparto funcionó. Estupendo. –

+0

Esa es la única. ¡Gracias! –

+0

De todas las respuestas, esta es la correcta. –

0

Otra forma es ODBC TRUNCATE funció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 el uso de una función de función con ROUND tercera conjunto de parámetros a 1.

0

Sé que esto es bastante tarde pero yo no lo veo como una respuesta y han estado utilizando este truco para años.

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

Su ejemplo:

declare @num decimal(9,5) = 123.456 

select round(@num-.005,2) 

vuelve 123.45

se ajustará automáticamente el redondeo al valor correcto que busca.

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

Cuestiones relacionadas