Redondeo de decimales

14/02/2005 - 16:40 por dmartinez | Informe spam
Hola, estoy utilizando el tipo decimal para hacer una serie de
operaciones matemáticas. Yo no deseo que haga redondeo, si no que
trunque las cifras que exceden el tamaño del campo. Por ejemplo, en el
siguiente script:

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(5,3)
set @num1 = 20.000
set @num2 = 3.000
set @num3 = @num1 / @num2

El resultado que sale es 6.667, mientras que lo que yo quiero es
6.666.
¿Hay alguna forma de lograrlo que no implique aumentar el tamaño del
campo y truncar después?

Un saludo y muchas gracias.

Preguntas similare

Leer las respuestas

#1 Maxi
14/02/2005 - 17:07 | Informe spam
Hola, en lugar de usar decimal porque no pruebas con el tipo de dato FLOAT?


Salu2
Maxi


"Diego M." escribió en el mensaje
news:
Hola, estoy utilizando el tipo decimal para hacer una serie de
operaciones matemáticas. Yo no deseo que haga redondeo, si no que
trunque las cifras que exceden el tamaño del campo. Por ejemplo, en el
siguiente script:

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(5,3)
set @num1 = 20.000
set @num2 = 3.000
set @num3 = @num1 / @num2

El resultado que sale es 6.667, mientras que lo que yo quiero es
6.666.
¿Hay alguna forma de lograrlo que no implique aumentar el tamaño del
campo y truncar después?

Un saludo y muchas gracias.
Respuesta Responder a este mensaje
#2 ulises
14/02/2005 - 17:41 | Informe spam
Usa ROUND con la opción de truncar,

set @num3 = ROUND( @num1 / @num2, 3 ,1 )

Saludos,
Ulises

On 14 Feb 2005 07:40:19 -0800, (Diego M.)
wrote:

Hola, estoy utilizando el tipo decimal para hacer una serie de
operaciones matemáticas. Yo no deseo que haga redondeo, si no que
trunque las cifras que exceden el tamaño del campo. Por ejemplo, en el
siguiente script:

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(5,3)
set @num1 = 20.000
set @num2 = 3.000
set @num3 = @num1 / @num2

El resultado que sale es 6.667, mientras que lo que yo quiero es
6.666.
¿Hay alguna forma de lograrlo que no implique aumentar el tamaño del
campo y truncar después?

Un saludo y muchas gracias.
Respuesta Responder a este mensaje
#3 Alejandro Mesa
14/02/2005 - 17:45 | Informe spam
Diego,

Cuando divides o multiplicas variables de tipo decimal o numeric, el
resultado tendra una presicion y escala dada por la tabla que aparece en los
libros en linea en el tema "Precision, Scale, and Length".

mk:@MSITStore:C:\Program%20Files\Microsoft%20SQL%20Server\80\Tools\Books\tsqlref.chm::/ts_da-db_8rc5.htm

Operation Result precision Result scale *
e1 + e2 max(s1, s2) + max(p1-s1, p2-s2) + 1 max(s1, s2)
e1 - e2 max(s1, s2) + max(p1-s1, p2-s2) max(s1, s2)
e1 * e2 p1 + p2 + 1 s1 + s2
e1 / e2 p1 - s1 + s2 + max(6, s1 + p2 + 1) max(6, s1 + p2 + 1)

Si calculamos estos valores, veras que son p = 14 y s = 9. Asi que si
definimos @num3 usando estos datos, tendras un valor que podra almacenar una
mejor precision, sin necesidad que sql server haga un redondeo. Luego podras
usar la funcion ROUND para truncar y convertir a p = 5 y s = 3 usando CAST.

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(14, 9)

set @num1 = 20.000
set @num2 = 3.000
set @num3 = @num1 / @num2

select @num3, cast(round(@num3, 3, 1) as numeric(5, 3))
go

De donde salieron los valores 14 y 9?

Bueno, yo lo aprendi de Steve Kass http://www.users.drew.edu/skass/ y a el
le doy el credito.

La formula es convertir el resultado a binario, p = primer byte y s = al
segundo byte.

SELECT
@num1 / @num2 as quotient,
cast(@num1 / @num2 as varbinary) as binRep,
cast(substring(cast(@num1 / @num2 as varbinary),1,1) as tinyint) as prec,
cast(substring(cast(@num1 / @num2 as varbinary),2,1) as tinyint) as scale
go


Saludos,

AMB


"Diego M." wrote:

Hola, estoy utilizando el tipo decimal para hacer una serie de
operaciones matemáticas. Yo no deseo que haga redondeo, si no que
trunque las cifras que exceden el tamaño del campo. Por ejemplo, en el
siguiente script:

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(5,3)
set @num1 = 20.000
set @num2 = 3.000
set @num3 = @num1 / @num2

El resultado que sale es 6.667, mientras que lo que yo quiero es
6.666.
¿Hay alguna forma de lograrlo que no implique aumentar el tamaño del
campo y truncar después?

Un saludo y muchas gracias.

Respuesta Responder a este mensaje
#4 Alejandro Mesa
14/02/2005 - 18:47 | Informe spam
Ulises,

Debemos tener cuidado con este tipo de operacion cuando usamos decimal o
numeric. Si no escogemos bien la precision y escala de @num3, entonces la
operacion pudiera terminar en error.

Ejemplo:

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(5, 3)

set @num1 = 99.001
set @num2 = 0.001
set @num3 = round(@num1 / @num2, 3, 1)

select @num3
go

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(14, 9)

set @num1 = 99.001
set @num2 = 0.001
set @num3 = @num1 / @num2

select @num3, round(@num3, 3, 1)
go


AMB

"ulises" wrote:

Usa ROUND con la opción de truncar,

set @num3 = ROUND( @num1 / @num2, 3 ,1 )

Saludos,
Ulises

On 14 Feb 2005 07:40:19 -0800, (Diego M.)
wrote:

>Hola, estoy utilizando el tipo decimal para hacer una serie de
>operaciones matemáticas. Yo no deseo que haga redondeo, si no que
>trunque las cifras que exceden el tamaño del campo. Por ejemplo, en el
>siguiente script:
>
>declare @num1 decimal(5,3)
>declare @num2 decimal(5,3)
>declare @num3 decimal(5,3)
>set @num1 = 20.000
>set @num2 = 3.000
>set @num3 = @num1 / @num2
>
>El resultado que sale es 6.667, mientras que lo que yo quiero es
>6.666.
>¿Hay alguna forma de lograrlo que no implique aumentar el tamaño del
>campo y truncar después?
>
>Un saludo y muchas gracias.


Respuesta Responder a este mensaje
#5 ulises
14/02/2005 - 19:15 | Informe spam
De acuerdo contigo, aunque la respuesta solo iba dirigida a responder
como truncar en lugar de redondear sin modificar la precisión ni
escala que es lo que se solicitó ... :)

Saludos,
Ulises

On Mon, 14 Feb 2005 09:47:03 -0800, "Alejandro Mesa"
wrote:

Ulises,

Debemos tener cuidado con este tipo de operacion cuando usamos decimal o
numeric. Si no escogemos bien la precision y escala de @num3, entonces la
operacion pudiera terminar en error.

Ejemplo:

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(5, 3)

set @num1 = 99.001
set @num2 = 0.001
set @num3 = round(@num1 / @num2, 3, 1)

select @num3
go

declare @num1 decimal(5,3)
declare @num2 decimal(5,3)
declare @num3 decimal(14, 9)

set @num1 = 99.001
set @num2 = 0.001
set @num3 = @num1 / @num2

select @num3, round(@num3, 3, 1)
go


AMB

"ulises" wrote:

Usa ROUND con la opción de truncar,

set @num3 = ROUND( @num1 / @num2, 3 ,1 )

Saludos,
Ulises

On 14 Feb 2005 07:40:19 -0800, (Diego M.)
wrote:

>Hola, estoy utilizando el tipo decimal para hacer una serie de
>operaciones matemáticas. Yo no deseo que haga redondeo, si no que
>trunque las cifras que exceden el tamaño del campo. Por ejemplo, en el
>siguiente script:
>
>declare @num1 decimal(5,3)
>declare @num2 decimal(5,3)
>declare @num3 decimal(5,3)
>set @num1 = 20.000
>set @num2 = 3.000
>set @num3 = @num1 / @num2
>
>El resultado que sale es 6.667, mientras que lo que yo quiero es
>6.666.
>¿Hay alguna forma de lograrlo que no implique aumentar el tamaño del
>campo y truncar después?
>
>Un saludo y muchas gracias.


Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaSiguiente Respuesta Tengo una respuesta
Search Busqueda sugerida