Foros del Web

Foros del Web (http://www.forosdelweb.com/)
-   SQL Server (http://www.forosdelweb.com/f87/)
-   -   Caso Anómalo (http://www.forosdelweb.com/f87/caso-anomalo-546564/)

carlos_c 09/01/2008 05:25

Caso Anómalo
 
Hola a todos. Tenemos un problemón que no tiene ni pies ni cabeza.

Llevamos muchos años programando y en uno de nuestros programas hechos en Visual Basic tenemos un problema excepcionalmente curioso. Resulta que cuando buscamos en una tabla un valor concreto NO SE ENCUENTRA.

Imaginaos la tabla: [operaciones]
Con los campos:
[Id] - Autonumérico
[importe] - Doble

Pues cuando buscamos cualquier importe usando la consulta:
SELECT id FROM operaciones WHERE importe = 7.5
se encuentran los registros sin problemas.

¡¡¡¡¡¡¡¡¡¡¡¡¡ EXCEPTO para el número 7.56 !!!!!!!!!!!!!!!

Si buscamos cualquier otro número funciona, pero no con ese.

¿Se le ocurre algo a alguien?

Muchas gracias a todos.

Sir Matrix 09/01/2008 06:27

Re: Caso Anómalo
 
Hola,

yo veo que está bien que la consulta no devuelva nada, el valor es 7.56, no 7.5.
Tal vez si le agregas un round puedes manejar lo de los decimales.

Saludos

pd: creo que no existe el tipo "double" en sql server

carlos_c 09/01/2008 07:35

Re: Caso Anómalo
 
Bueno en realidad la función Round sólo funciona para el caso de nuestra base de datos en SQL, y tampoco resulta. Ni con un Round aparece. En Access 97 no se puede usar esa función, se usa a partir de 2000.

Lo del tipo Doble hacía referencia a ACCESS, que lo tenemos de tipo Numérico - Doble. En SQL lo tenemos como Float.

Ya sabemos que el problema está en las bases de datos más antiguas. En SQL Server 2005 y en ACCESS 2000 si se puede, pero si probáis a crearos una tabla en Access 97 (tan sencilla como la que os dije antes) y le añadís un registro con el valor de importe 7.56, no la encontraréis con las sentencias SQL. Lo mismo pasa con versiones antiguas de SQLServer, que lo hemos probado (incluso con el Round). Es extremadamente raro pues números como 8.56, 7,55 ó 7.58 se encuentran sin el mayor problema usando la cadena que os comenté antes.

Gracias.

carlos_c 09/01/2008 07:40

Re: Caso Anómalo
 
Cita:

Iniciado por Sir Matrix (Mensaje 2241746)
yo veo que está bien que la consulta no devuelva nada, el valor es 7.56, no 7.5.

No me expliqué bien. El registro de la base de datos tiene en su importe 7.56. Y es lo que no funciona haciendo la consulta y buscando 7.56 lógicamente. Si el registro tiene 7.5 y lo buscas por 7.5, sí aparece.

Como bien dices, si el resgitro tuviera 7.56 y lo buscas con 7.5 es normal que no aparezca. Pero no es el caso. Buscamos lo que tenemos y no aparece si es ese puñetero número. Es una locura.

Sir Matrix 09/01/2008 07:56

Re: Caso Anómalo
 
Hola, que raro lo de las versiones antiguas. En mssql podría solucionarse cambiando el tipo de datos de float a un decimal o numeric que acepte los decimales que necesites. El tipo folat no es muy preciso:
"float y real: Tipos de datos numéricos y aproximados que se utilizan con datos numéricos de punto flotante. Los datos de punto flotante son aproximados; no todos los valores del intervalo del tipo de datos se pueden representar con precisión."

En access 97 ni idea, sòlo podrías probar consultando por algo como
SELECT id FROM operaciones WHERE importe > 7.55 and importe <7.57

y ver si así te trae los datos, alomejor el valor en realidad no es de 7.56 sino algo como 7.56000000000000000001 :P

saludoss

Beakdan 09/01/2008 11:59

Re: Caso Anómalo
 
Cita:

a lo mejor el valor en realidad no es de 7.56 sino algo como 7.56000000000000000001
Sir Matrix tiene razón. Además, no es un caso anómalo. Es un error de diseño el definir un campo que guarda un valor monetario como float. La documentación de SQL Server es muy explicita sobre los tipos de datos.

Cita:

float and real:
Approximate-number data types for use with floating point numeric data. Floating point data is approximate; therefore, not all values in the data type range can be represented exactly.
Para valores monetarios deberías usar money o smallmoney los cuales tienen una precisión hasta la diezmilésima. Si no bastara con esa precisión, entonces tienes numeric o decimal. Money, SmallMoney, Numeric y Decimal están clasificados en la documentación de SQL Server como valores númericos exactos.

Mithrandir 09/01/2008 16:11

Re: Caso Anómalo
 
select convert(real, 7.56)

Verás que equivale a 7.5599999

Prueba con Money o Numeric como te sugieren.


La zona horaria es GMT -6. Ahora son las 06:41.

Desarrollado por vBulletin® Versión 3.8.7
Derechos de Autor ©2000 - 2026, Jelsoft Enterprises Ltd.