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

¿Qué hay de diferente entre estas dos operaciones aritméticas en mysql?

Estas en el tema de ¿Qué hay de diferente entre estas dos operaciones aritméticas en mysql? en el foro de Mysql en Foros del Web. Hola a todos. Siguiendo un pequeño tutorial, encuentro que estos dos casos dan resultados diferentes, pero no explica por qué. ¿Podríais ayudarme a comprenderlo? Muchas ...
  #1 (permalink)  
Antiguo 15/09/2016, 07:54
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años, 7 meses
Puntos: 5
¿Qué hay de diferente entre estas dos operaciones aritméticas en mysql?

Hola a todos. Siguiendo un pequeño tutorial, encuentro que estos dos casos dan resultados diferentes, pero no explica por qué. ¿Podríais ayudarme a comprenderlo?

Muchas gracias.

Se supone que es el máximo número entero que se puede almacenar en Mysql, multiplicado por 2 (número entero):

18446744073709551615*2;

Esto da como resultado (porque se sale del rango almacenable, claro):

Código MySQL:
Ver original
  1. ERROR 1690 (22003): BIGINT UNSIGNED value is out of range in '(18446744073709551
  2. 615 * 2)'

Pero cuando haces la misma operación anterior, sólo que multiplicando por 2.0 (número flotante), tal que así:

18446744073709551615*2.0;

Resulta que sí devuelve un resultado válido:

36893488147419103230.0

Sabéis a qué se debe esto? No entiendo la diferencia que pueda haber entre multiplicar por 2 a hacerlo por 2.0...

Un saludo y muchas gracias de nuevo.





Pero si hago
  #2 (permalink)  
Antiguo 15/09/2016, 08:08
Colaborador
 
Fecha de Ingreso: enero-2007
Ubicación: México
Mensajes: 2.097
Antigüedad: 17 años, 10 meses
Puntos: 447
Respuesta: ¿Qué hay de diferente entre estas dos operaciones aritméticas en mysql?

Hola BramSt:

La respuesta es simple, no es lo mismo 2 a 2.0

¿Suena extraño? no lo es tanto, ya que matemáticamente "valen" lo mismo en realidad estamos hablando de dos cosas distintas ya que uno es un ENTERO y el otro es un FLOTANTE.

existen algunas reglas cuando haces operaciones matemáticas entre números, por ejemplo

Código:
ENTERO * ENTERO = ENTERO
ENTERO * FLOTANTE = FLOTANTE
ENTERO / ENTERO = FLOTANTE
Los dos primeros casos son los que se están presentando, en tu primer caso estás multiplicando dos números enteros, por lo tanto mySQL asigna el tipo resultado como un ENTERO, al sobrepasar el límite permitido entonces marca el error.

En el segundo caso, al multiplicar por un numero FLOTANTE, entonces mysql le asigna el resultado un tipo flotante, por lo tanto el resultado es un flotante, (observa que al final le pone un .0)

Código:
36893488147419103230.0
En el caso de la división, no importa el tipo de dato que utilices, el resultado siempre será un tipo flotante,

¿Se entiende?

Saludos
Leo.
  #3 (permalink)  
Antiguo 16/09/2016, 11:02
Avatar de BramSt  
Fecha de Ingreso: abril-2015
Mensajes: 117
Antigüedad: 9 años, 7 meses
Puntos: 5
Respuesta: ¿Qué hay de diferente entre estas dos operaciones aritméticas en mysql?

Gracias leonardo

Lo de los tipos sí lo tengo claro, pero entonces, es que los tipos de coma flotante tienen más rango que los enteros?

He mirado el mite de rango, y como es esto:

Cita:
Float: número pequeño en coma flotante de precisión simple. Los valores válidos van desde -3.402823466E+38 a -1.175494351E-38, 0 y desde 1.175494351E-38 a 3.402823466E+38.
No me queda muy claro si el número 36893488147419103230.0 excede o no, la verdad. Supongo que al ser de letras me falta cierta base matemática

Es que yo no encuentro diferencia alguna (salvo en el tipo de dato que es, claro), entre:

36893488147419103230

y

36893488147419103230.0

Por otro lado, me deja un poco perplejo eso que me dices de que una divisón devuelve un flotante... ¿no es 4/2, por ejemplo, igual a 2? Se supone que el resultado es un entero...

Muchas gracias por tu explicación, Leonardo.

Etiquetas: diferente, operaciones, sql
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 18:58.