Las matematicas son exactas en SQL??

01/07/2003 - 16:36 por Pablo Corredor | Informe spam
Hola a Todos

Tengo un problema con unas operaciones resulta que en una tabla tengo dos
valores:
Factor1 que es de tipo real(4), y Factor2 que es Int(4), como se ilustra en
el ejemplo
hago una operacion multiplicando los dos valores y luego dividiendo por 100,
el resultado
esperado es 1421.0700. como hago para mantener la misma prescision



Select Factor1, Factor2,Factor1 * Factor2 as Resultado ,
Factor1 * Factor2 /100 as Dividido100
from TablaPrueba


Factor1 Factor2 Resultado Dividido100
-
101.0 1407 142107.0 1421.0699

Preguntas similare

Leer las respuestas

#1 Liliana Sorrentino
01/07/2003 - 17:12 | Informe spam
Pablo:
cuando realizás operaciones con dos tipos de campos diferentes, SQL hace una
conversión al tipo de datos mayor, en este caso, real. La solución en tu
caso es usar un CONVERT o CAST.

Select Factor1, Factor2,Factor1 * Factor2 as Resultado ,
Convert (dec(12,2), Factor1 * Factor2 /100) as Dividido100
from TablaPrueba

Saludos... Liliana.

"Pablo Corredor" escribió en el mensaje
news:
Hola a Todos

Tengo un problema con unas operaciones resulta que en una tabla tengo dos
valores:
Factor1 que es de tipo real(4), y Factor2 que es Int(4), como se ilustra


en
el ejemplo
hago una operacion multiplicando los dos valores y luego dividiendo por


100,
el resultado
esperado es 1421.0700. como hago para mantener la misma prescision



Select Factor1, Factor2,Factor1 * Factor2 as Resultado ,
Factor1 * Factor2 /100 as Dividido100
from TablaPrueba


Factor1 Factor2 Resultado Dividido100
-
101.0 1407 142107.0 1421.0699


Respuesta Responder a este mensaje
#2 Javier Loria\(MVP\)
01/07/2003 - 19:14 | Informe spam
Hola Pablo:
Las Matematicas son Exactas en SQL? SI.
Los tipos de datos pueden ser o no ser exactos.
Cuando usas un Tipo REAL estas precisamente tomando un Tipo de Dato que NO
ES EXACTO, y sacrificas esa habilidad por la habilidad de poder representar
numeros muy grandes o muy pequenos sin sacrificar demasiado espacio.
De este forma cuando escribes el Numero 2, SQL no graba un dos sino que
graba +3.01029996E-1. Este numero es el Logaritmo Base 10 de 2. Al hacerlo
SQL se "olvida" de los ultimos decimales. Por eso puede ser que realizes
operaciones donde 2+2 NO sea 4 sino 3.999913. MS a agregado codigo para que
2+2=4 haciendo "redondeos" que evitan algunos de los problemas pero no hay
garantias.
Prueba el siguiente codigo:

/* Inicio de Codigo con REAL */
DECLARE @MyFactor REAL
SET @MyFactor2107.0
SELECT @MyFactor,@MyFactor/100
/* Fin de Codigo con REAL */

Ahora prueba el mismo codigo con un TIPO EXACTO como es DECIMAL o NUMERIC:

/* Inicio de Codigo con DECIMAL */
DECLARE @MyFactor DECIMAL
SET @MyFactor2107.0
SELECT @MyFactor,@MyFactor/100
/* Fin de Codigo con DECIMAL */

Veras que los resultados son los deseados,



Javier Loria
Costa Rica (MVP)
Se aprecia la inclusion de DDL (CREATE, INSERTS, etc.)
que pueda ser copiado y pegado al Query Analizer.
La version de SQL y Service Pack tambien ayuda.





"Pablo Corredor" wrote in message
news:
Hola a Todos

Tengo un problema con unas operaciones resulta que en una tabla tengo dos
valores:
Factor1 que es de tipo real(4), y Factor2 que es Int(4), como se ilustra


en
el ejemplo
hago una operacion multiplicando los dos valores y luego dividiendo por


100,
el resultado
esperado es 1421.0700. como hago para mantener la misma prescision



Select Factor1, Factor2,Factor1 * Factor2 as Resultado ,
Factor1 * Factor2 /100 as Dividido100
from TablaPrueba


Factor1 Factor2 Resultado Dividido100
-
101.0 1407 142107.0 1421.0699


Respuesta Responder a este mensaje
#3 Liliana Sorrentino
01/07/2003 - 20:02 | Informe spam
Pablo,
como recibí tu mensaje en mi mail te contesté de la misma manera, pero lo
posteo acá por si a algún compañero se le ocurre algo mejor.

Hola Pablo,
es cierto, el CONVERT o el CAST no te permiten parámetros en su sintaxis,
pero se me ocurrió algo así como triquiñuela:

declare @factor1 real select @factor1 = 101.2345
declare @factor2 int select @factor2 = 1407
declare @decimal smallint select @decimal = 4 este es el parámetro

Select @Factor1, @Factor2,
@Factor1 * @Factor2 as Resultado ,
@Factor1 * @Factor2 / 100 as Dividido100,
round(convert(dec(12,6), @Factor1 * @Factor2 /100), @decimal) as
Redondeado

En el ROUND, la cantidad de decimales sí puede tener una variable, entonces
convertiría primero a un número decimal con una cantidad grande de
decimales, la que sea el máximo permitido (en este caso le puse 6), y
después redondeás a la que realemente ingresaron.
Sigo mirando, nunca tuve que usar algo así. Yo uso SQL7 y no encuentro forma
de setear la cantidad de decimales, tal vez en SQL2000, ¿vos cuál tenés?

Saludos... Liliana.

"Pablo Corredor" escribió en el mensaje
news:Ob4IKA$

Liliana


Antes que nada mil gracias por tu respueta, quisiera ampliar un poco el


tema
..

1. la precisión decimal debe ser Configurable es decir en una Tabla de
parametros debo incluir el numero de decimales con los que trabaja el
sistema, para el caso de ejemplo son 4, cuando intento hacer esto me da
error ya que la en el tipo de dato del convert no puedo incluir un
parametro. ¿Qué puedo hacer?
2. provisionalmente dejo el convert con dec(12,4) y estando asi el
resultado es el mismo 1421.0699



"Liliana Sorrentino" escribió en el


mensaje
news:OMipvL#
> Pablo:
> cuando realizás operaciones con dos tipos de campos diferentes, SQL hace
una
> conversión al tipo de datos mayor, en este caso, real. La solución en tu
> caso es usar un CONVERT o CAST.
>
> Select Factor1, Factor2,Factor1 * Factor2 as Resultado ,
> Convert (dec(12,2), Factor1 * Factor2 /100) as Dividido100
> from TablaPrueba
>
> Saludos... Liliana.
>
> "Pablo Corredor" escribió en el mensaje
> news:
> > Hola a Todos
> >
> > Tengo un problema con unas operaciones resulta que en una tabla tengo
dos
> > valores:
> > Factor1 que es de tipo real(4), y Factor2 que es Int(4), como se
ilustra
> en
> > el ejemplo
> > hago una operacion multiplicando los dos valores y luego dividiendo


por
> 100,
> > el resultado
> > esperado es 1421.0700. como hago para mantener la misma prescision
> >
> >
> >
> > Select Factor1, Factor2,Factor1 * Factor2 as Resultado ,
> > Factor1 * Factor2 /100 as Dividido100
> > from TablaPrueba
> >
> >
> > Factor1 Factor2 Resultado
Dividido100
>

> > -
> > 101.0 1407 142107.0


1421.0699
> >
> >
>
>


email Siga el debate Respuesta Responder a este mensaje
Ads by Google
Help Hacer una preguntaRespuesta Tengo una respuesta
Search Busqueda sugerida