SQL Server - ¿ROUND no funciona en todos los casos?

 
Vista:

¿ROUND no funciona en todos los casos?

Publicado por Gerónimo (2 intervenciones) el 30/12/2007 17:30:24
Buenos días
He intentado utilizar la función ROUND para actualizar un campo de tipo float y he encontrado que funciona en algunos casos y en otros no.
La instrucción que he utilizado es de este tipo:

update tabla1 set monto=round(monto,2,0) where (condicion independiente de monto)

Por ejemplo cuando el campo tiene originalmente un valor como el siguiente: 24183.169999999998, el valor resultante es exactamente el mismo.

¿A qué se debe esto?
Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:¿ROUND no funciona en todos los casos?

Publicado por Isaias (3308 intervenciones) el 02/01/2008 19:33:03
Estoy ejecutando un simple SELECT con tus datos desde el analizador de consultas y este es el resultado:

select round(24183.169999999998,2,0)

------------------------------------------------------------------
24183.170000000000

(1 row(s) affected)
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿ROUND no funciona en todos los casos?

Publicado por Gerónimo (2 intervenciones) el 03/01/2008 23:22:58
Con la instrucción SELECT en esa forma sí funciona, pero el problema ocurre con la instrucción UPDATE aplicada sobre un campo tipo float, e incluso ocurre también con SELECT al tratar de recuperar ROUND(campoTipoFloat). Se puede comprobar el problema así:
1. Se crea un campo tipo float en la tabla y se le asigna un valor como el del ejemplo (24183.169999999998)
2. Se ejecuta UPDATE tabla set campo= round(campo,2)
3. Se ejecuta SELECT campo from tabla.
4. Se ejecuta SELECT round(campo,2) from tabla.

Cuando he probado esto el resultado de 3 y 4 es exactamente el mismo valor original (por ejemplo 24183.169999999998 ó 2.418317E+16)

Supongo que el problema se puede solucionar cambiando el tipo de datos a decimal ó a money, pero quería saber a qué se debe el problema con los datos tipo float.
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿ROUND no funciona en todos los casos?

Publicado por Isaias (3308 intervenciones) el 03/01/2008 23:54:20
Tienes razon, como el tipo FLOAT nunca sera exacto, deberas hacer la conversion a decimal:

CREATE TABLE #PRUEBA (ID INT IDENTITY(1,1), NUMERO FLOAT)
INSERT INTO #PRUEBA VALUES( 24183.169999999998)
SELECT * FROM #PRUEBA
SELECT ROUND(CAST(NUMERO AS DECIMAL (20,12)),2,0) FROM #PRUEBA
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:¿ROUND no funciona en todos los casos?

Publicado por Juan (1 intervención) el 16/01/2012 21:50:29
Yo tambien me encontre con ese problema, al querer redondear un numero a cero decimales,
el resultado de mi query me da lo siguiente

para este valor:
22934681.600 lo redondea a 22934681
pero para otro valor del mismo query pasa lo siguiente:
19624623.800 lo redondea a 19624624

y no se como solucionar esto, ya intente con un CAST, CONVERT a varios tipos de datos, y me manda siempre el mismo resultado
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar