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

Problema con ROUND

Estas en el tema de Problema con ROUND en el foro de Mysql en Foros del Web. hola a todos sucede que uso round en una funcion de mysql y me redondea para abajo siendo que si coloco round y el mismo ...
  #1 (permalink)  
Antiguo 04/12/2009, 10:32
 
Fecha de Ingreso: octubre-2008
Mensajes: 18
Antigüedad: 15 años, 6 meses
Puntos: 1
Exclamación Problema con ROUND

hola a todos

sucede que uso round en una funcion de mysql y me redondea para abajo
siendo que si coloco round y el mismo numero pero escrito redondea hacia arriba.



SELECT
ROUND(nivel_venta.precio_nivel_venta * producto.peso_producto * ((100-lista_precio.descuento)/100),-2) AS Precio_Producto,
ROUND(8250,-2)


me deberia dar 8300 en los 2 pero en el de arriba me da 8200 y el de abajo 8300

como podria resolver esto.

muchas gracias
  #2 (permalink)  
Antiguo 04/12/2009, 11:25
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, 5 meses
Puntos: 2658
Respuesta: Problema con ROUND

La función ROUND() realiza la misma operación de redondeo matemático que te enseñaron en la escuela: Si el valor está por debajo de la mitad, se descarta y si está de la mitad para arriba, se redondea hacia arriba.
Cuando redondeabas en la escuela:
Cita:
8.34 = 8
8.36 = 8
8.50 = 9
8.75 = 9
¿Se entiende?

El redondeo que hace ROUND() es correcto, la división hecha en la sentencia debe estar dando menos de 8250. Si te diese 8249.999999999, de todos modos sería 8200, porque ese valor es inferior a 8250.
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #3 (permalink)  
Antiguo 04/12/2009, 12:46
 
Fecha de Ingreso: octubre-2008
Mensajes: 18
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Problema con ROUND

a eso voy. la div. devuelve 8250

si entiendo lo del redondeo. solo que no responde como quiero. deberia quedar en 8300 y no lo hace. ya que si le quito el round me devuelve esacto 8250
  #4 (permalink)  
Antiguo 04/12/2009, 12:56
 
Fecha de Ingreso: octubre-2008
Mensajes: 18
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Problema con ROUND

el calculo de arriba es este

1500 * 5.5 * 1 = 8250

y es esacto. por que ocurre ese mal redondeo?

EDITO:

cuando cambio el campo producto.peso_producto por
ROUND(nivel_venta.precio_nivel_venta *5.5*((100-lista_precio.descuento)/100),-2) AS Precio_Producto,

funciona bien. cual seria el problema con ese campo??

gracias

Última edición por SilverTracK; 04/12/2009 a las 13:09
  #5 (permalink)  
Antiguo 04/12/2009, 13:43
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, 5 meses
Puntos: 2658
Respuesta: Problema con ROUND

¿Y cuánto valen nivel_venta.precio_nivel_venta y lista_precio.descuento en ese momento dado?
Un ejemplo:
Código sql:
Ver original
  1. SELECT
  2.   (1500 *5.5*((100-0)/100)) Prueba1_A,
  3.   round((1500 *5.5*((100-0)/100)),-2) Prueba1_B,
  4.   (1405 *5.5*((100-0)/100)) Prueba2_A,
  5.   round((1405 *5.5*((100-0)/100)),-2) Prueba2_B;

El resultado es:
Código sql:
Ver original
  1. mysql> SELECT
  2.     ->   (1500 *5.5*((100-0)/100)) Prueba1_A,
  3.     ->   round((1500 *5.5*((100-0)/100)),-2) Prueba1_B,
  4.     ->   (1405 *5.5*((100-0)/100)) Prueba2_A,
  5.     ->   round((1405 *5.5*((100-0)/100)),-2) Prueba2_B;
  6. +------------+-----------+------------+-----------+
  7. | Prueba1_A  | Prueba1_B | Prueba2_A  | Prueba2_B |
  8. +------------+-----------+------------+-----------+
  9. | 8250.00000 |      8300 | 7727.50000 |      7700 |
  10. +------------+-----------+------------+-----------+
  11. 1 ROW IN SET (0.00 sec)

Los redondeos dan perfecto... ¿Cómo es posible que te falle? depende del valor que interviene en cada parte, y es posible que dependa de la versiónde MySQL, ya que algunas releases tuvieron bugs.
¿Cuál usas tu?
Verifica con una prueba de escritorio.
__________________
¿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 04/12/2009, 13:57
 
Fecha de Ingreso: octubre-2008
Mensajes: 18
Antigüedad: 15 años, 6 meses
Puntos: 1
Respuesta: Problema con ROUND

gracias por responder

en el caso planteado de ingresar como numeros
Código sql:
Ver original
  1. SELECT
  2. (1500 *5.5*((100-0)/100)) Prueba1_A,  
  3. round((1500 *5.5*((100-0)/100)),-2) Prueba1_B,  
  4. (1405 *5.5*((100-0)/100)) Prueba2_A,  
  5. round((1405 *5.5*((100-0)/100)),-2) Prueba2_B;

Funciona como tu dices pero cuando hago llamada de datos a travez de una tabla que es el valor 5.5 (float lo tengo definido) pasa el error que te dije

y la version de mysql es 5.0.51

Última edición por SilverTracK; 04/12/2009 a las 14:31
  #7 (permalink)  
Antiguo 04/12/2009, 15:49
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, 5 meses
Puntos: 2658
Respuesta: Problema con ROUND

El problema puede estar dado por el FLOAT, ya que es un tipo de columna de punto flotante, lo que significa esencialmente que guarda valores por aproximación (ver coma flotante), por lo que no se trata de numeros de precisión como los que supones.
Según el manual de referencia oficial (Tipos Numéricos):
Cita:
El tipo FLOAT se usa para representar tipos numéricos aproximados. El estándar SQL permite una especificación opcional de la precisión (pero no del rango del exponente) en bits a continuación de la palabra clave FLOAT entre paréntesis. La implementación de MySQL soporta esta especificación opcional de precisión, pero el valor de precisión se usa sólo para determinar el tamaño de almacenamiento. Una precisión de 0 a 23 resulta en una columna de precisión simple de cuatro bytes de tamaño FLOAT . Una precisión de 24 a 53 resulta en una columna de doble precisión de ocho bytes de tamaño DOUBLE .
Y también, remarca el manual:
Cita:
Los tipos DECIMAL y NUMERIC se implementan como el mismo tipo en MySQL. Se usan para guardar valores para los que es importante preservar una precisión exacta, por ejemplo con datos monetarios. Cuando se declara una columna de alguno de estos tipos, la precisión y la escala puede especificarse (y usualmente se hace), por ejemplo:
Yo te sugeriría probar cambiando la definición de la tabla...
__________________
¿A quién le enseñan sus aciertos?, si yo aprendo de mis errores constantemente...
"El problema es la interfase silla-teclado." (Gillermo Luque)
  #8 (permalink)  
Antiguo 07/12/2009, 05:18
 
Fecha de Ingreso: octubre-2008
Mensajes: 18
Antigüedad: 15 años, 6 meses
Puntos: 1
De acuerdo Respuesta: Problema con ROUND

Gracias por la respuesta.

al cambiar el valor FLOAT por DECIMAL(8,2) el redondeo no tiene error.

Gracias denuevo.
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 07:44.