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

#6 dmartinez
15/02/2005 - 09:52 | Informe spam
Muchas gracias a todos, creo que la opción de cambiar el tamaà±o (la
precisión) del campo es factible en mi problema y me permite hacer lo
que quiero. Una vez mà¡s gracias a todos por tomaros la molestia de
contestar

Un saludo,
Diego.


"=?Utf-8?B?QWxlamFuZHJvIE1lc2E=?=" wrote in message news:...
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
#7 dmartinez
15/02/2005 - 09:56 | Informe spam
Hola, tenía entendido que el usar decimal (o numeric) era más
conveniente cuando se intentaban evitar redondeos automáticos en los
datos

"Maxi" wrote in message news:<#...
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.
email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una pregunta AnteriorRespuesta Tengo una respuesta
Search Busqueda sugerida