Foros del Web » Programación para mayores de 30 ;) » Bases de Datos General » Mysql »

[SOLUCIONADO] ROUND no realiza el redondeo

Estas en el tema de ROUND no realiza el redondeo en el foro de Mysql en Foros del Web. Hola: Tengo un problema con la función ROUND. En la siguiente consulta, el Total debería darme 1171.45, pero me entrega 1171.44: Código: select @a := ...
  #1 (permalink)  
Antiguo 17/08/2015, 13:42
 
Fecha de Ingreso: octubre-2006
Mensajes: 267
Antigüedad: 17 años, 6 meses
Puntos: 6
Pregunta ROUND no realiza el redondeo

Hola:

Tengo un problema con la función ROUND. En la siguiente consulta, el Total debería darme 1171.45, pero me entrega 1171.44:

Código:
select @a := 992.7500, ROUND(@a * (1 + 18 / 100), 2) AS Total;
Si ejecuto la sentencia en Workbench, la primera me da el valor 1171.44, pero si vuelvo a ejecutarla sin realizar ninguna mdificación, me retorna el valor correcto que es 1171.45. Lo raro es que sólo ocurre cuando utilizo variables, ya que si colocase el valor de tal variable dentro de la función ROUND, el redondeo es correcto. ¿Por qué la sentencia como está no me calcula el redonde como debe ser a la primera?

Muchas gracias.
  #2 (permalink)  
Antiguo 17/08/2015, 13:49
Avatar de Libras
Colaborador
 
Fecha de Ingreso: agosto-2006
Ubicación: En la hermosa perla de occidente
Mensajes: 7.412
Antigüedad: 17 años, 8 meses
Puntos: 774
Respuesta: ROUND no realiza el redondeo

de que tipo es tu variable??
__________________
What does an execution plan say to t-sql query? Go f**k yourself, if you are not happy with me
  #3 (permalink)  
Antiguo 17/08/2015, 13:52
 
Fecha de Ingreso: octubre-2006
Mensajes: 267
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: ROUND no realiza el redondeo

Hola, gracias por la respuesta. La definición de la variable la hago en el momento de la consulta. No la defino previamente.

Última edición por metalfox6383; 17/08/2015 a las 15:05
  #4 (permalink)  
Antiguo 19/08/2015, 15:48
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 3 meses
Puntos: 447
Respuesta: ROUND no realiza el redondeo

Hola metalfox6383:

Hace tiempo tuve un problema semejante y en realidad nunca pude encontrar el porqué, sin embargo tiene que ver con la asignación del valor a la variable en el mismo SELECT. Una posible solución es hacerlo en partes, es decir, primero asignar el valor a tu variable y después hacer el select, es decir, algo como esto:

Código:
SET @a := 992.7500;
SELECT @a, ROUND(@a * (1 + 18 / 100), 2) AS Total;
De esta manera desde la primera ejecución obtienes el valor correcto:

Código MySQL:
Ver original
  1. mysql> SET @a := 992.7500;
  2. Query OK, 0 rows affected (0.00 sec)
  3.  
  4. mysql> SELECT @a, ROUND(@a * (1 + 18 / 100), 2) AS Total;
  5. +----------+---------+
  6. | @a       | Total   |
  7. +----------+---------+
  8. | 992.7500 | 1171.45 |
  9. +----------+---------+
  10. 1 row in set (0.00 sec)

Haz la prueba y nos comentas, y si descubres el porqué sucede esto coméntalo en el foro para tenerlo en cuenta.

Saludos
Leo.
  #5 (permalink)  
Antiguo 19/08/2015, 20:29
Avatar de gnzsoloyo
Moderador criollo
 
Fecha de Ingreso: noviembre-2007
Ubicación: Actualmente en Buenos Aires (el enemigo ancestral)
Mensajes: 23.324
Antigüedad: 16 años, 4 meses
Puntos: 2658
Respuesta: ROUND no realiza el redondeo

Es un comportamiento propio de las variables de usuario de MySQL.
Al principio, las variables de usuario no tienen tipo de dato, su valor es NULL, y se redefinen con el primer valor que se almacena en ellas. En tu caso pasan a ser DECIMAL, dada la longitud del dato con el que se definen en la primera columna, y el truncado se produce por redondeo hacia abajo.
En la segunda ejecución ya tienen tipo de dato, decimal, y la operación genera una conversión implícita en FLOAT, cuyo redondeo es hacia arriba.
Código MySQL:
Ver original
  1. mysql> select @a := 992.75 Inicial, (@a * (1 + 18 / 100)) completo, ROUND(@a * (1 + 18 / 100), 2) Total;
  2. +---------+----------+---------+
  3. | Inicial | completo | Total   |
  4. +---------+----------+---------+
  5. |  992.75 | 1171.445 | 1171.44 |
  6. +---------+----------+---------+
  7. 1 row in set (0.00 sec)
  8.  
  9. mysql> select @a := 992.75 Inicial, (@a * (1 + 18 / 100)) completo, ROUND(@a * (1 + 18 / 100), 2) Total;
  10. +---------+-------------------------------------+---------+
  11. | Inicial | completo                            | Total   |
  12. +---------+-------------------------------------+---------+
  13. |  992.75 | 1171.445000000000000000000000000000 | 1171.45 |
  14. +---------+-------------------------------------+---------+
  15. 1 row in set (0.00 sec)
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #6 (permalink)  
Antiguo 23/08/2015, 17:52
 
Fecha de Ingreso: octubre-2006
Mensajes: 267
Antigüedad: 17 años, 6 meses
Puntos: 6
Respuesta: ROUND no realiza el redondeo

Hola, compañeros. Muchas gracias por sus respuestas. Efectivamente, primero hay que setear la variable y luego utilizarla para obtener el redondeo que se espera, y eso es lo que pasa con un segundo select. Es una lástima, porque esperaba realizar esta sentencia con un sólo "run". Por el momento estoy dejando que la aplicación realice el redondeo. Muchas gracias otra vez.

Etiquetas: round, select
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 17:46.