Foros del Web » Programando para Internet » Python »

duda con decimal, float

Estas en el tema de duda con decimal, float en el foro de Python en Foros del Web. Hola lista. Tengo una duda. Estoy formando un diccionario: Código PHP: diccionario [ 'sumaSubtotal' ] =  cursor . fetchone ()[ 0 ] <---  lo obtengo de la base de datos ,  es un Decimal ,  ...
  #1 (permalink)  
Antiguo 16/12/2010, 11:37
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
duda con decimal, float

Hola lista. Tengo una duda. Estoy formando un diccionario:
Código PHP:
diccionario['sumaSubtotal'] = cursor.fetchone()[0] <--- lo obtengo de la base de datoses un Decimalpuesto que representa a un campo del tipo numeric.

diccionario['sumaDescuento'] = round(diccionario['sumaSubtotal']*self.descuento_porcentaje/100)

diccionario['sumaTotal'] = diccionario['sumaSubtotal'] - diccionario['sumaDescuento'
Esto me lanza una excepcion "unsupported operand type(s) for -: 'Decimal' and 'float'"

Debido a que al aplicar el round en dicc...['sumaDescuento'] se transforma de Decimal a float.
Es posible, de alguna forma evitar que se transforme de Decimal a float al aplicar el round???

Se que también podría pasarlo a str y después a decimal, o pasarlo a long operar y despues volverlo a float para quede no que de forma ilegible, pero quería saber si hay alguna forma más limpia de hacerlo.

A propósito, otra duda. Para python hay alguna diferencia al trabajar con decimal o float?Lo digo por que yo he observado en bases de datos postgreSQL que cuando se trabaja con números grandes es más seguro usar numeric, debido a que las aproximaciones con otros tipos de datos como decimal son más inexactas.

P.D:Bueno, tal véz, como uso valores redondeados, quizás da lo mismo de los números decimales.

Saludos.

Última edición por refreegrata; 16/12/2010 a las 11:51
  #2 (permalink)  
Antiguo 16/12/2010, 11:52
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda con decimal, float

Te recomiendo leer la documentación del módulo decimal: http://docs.python.org/library/decimal.html

Creo que allí se contestan tus dudas, pero si te queda cualquier pregunta no dudes en plantearla por acá.


Saludos.
  #3 (permalink)  
Antiguo 16/12/2010, 12:25
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Respuesta: duda con decimal, float

Mira, disculpa, pero es que hoy estoy un poco lerdo y me esta costando entender lo que dice ahí, pero según pude entender, y por favor corrígeme si estoy equivocado, los float carecen de la precisión que pudieran llegar a tener los decimal. Ahora si yo, en mis numeros sólo tengo ceros después de la coma da los mismo que use long, decimal o float,
pero sin embargo, al usar números con valores significativos después de la coma si puedo notar una diferencia de precisión en trabajar con decimales o floats. Es esto así?

Mi pregunta, que no pude aclarar(probablemente a que no supe interpretar del todo bien el texto) es:
si el round transforma un número de decimal a float, podría ,de alguna forma, ser este número diferente al número que se obtendría si la función round nunca pasará el número de decimal a float, lo dejará como decimal(es decir, menos exacto)?
  #4 (permalink)  
Antiguo 16/12/2010, 15:42
AlvaroG
Invitado
 
Mensajes: n/a
Puntos:
Respuesta: duda con decimal, float

Cita:
Iniciado por refreegrata Ver Mensaje
Es esto así?
Sí, así es. El origen de la diferencia viene desde la representación interna de los tipos.

Cita:
Iniciado por refreegrata Ver Mensaje
si el round transforma un número de decimal a float, podría ,de alguna forma, ser este número diferente al número que se obtendría si la función round nunca pasará el número de decimal a float, lo dejará como decimal(es decir, menos exacto)?
No lo creo, porque si bien round() devuelve un float, éste representa a un entero (será un número con muchos ceros luego de la coma) por lo que no perderías nada de precisión al pasarlo a Decimal. Si te encontrás con una diferencia, esa diferencia sin duda estará en la operación (la multiplicación y la división).
Hay que tener algo más en cuenta: cuando se habla de que el tipo float no es exacto, se habla de cosas como

1,20000000000001 en vez de 1,2
0,999999999999996 en vez de 1

que si bien tienen una diferencia, en aplicaciones prácticas se pueden redondear de forma sencilla y no generan problemas. Tal y como lo ejemplifica el manual en la página que te pasé antes:
con el tipo Decimal,
0.1 + 0.1 + 0.1 - 0.3 = 0
Pero en representación de punto flotante,
0.1 + 0.1 + 0.1 - 0.3 = 5.5511151231257827e-017 = 0,000000000000000055....
es decir, hay una diferencia pero es ínfima.

Para resumir, de ser posible te recomiendo que hagas todas las operaciones con el tipo Decimal (convirtiendo con la función Decimal()). Otra solución posible es convertir en Decimal el valor devuelto por round().


Saludos.
  #5 (permalink)  
Antiguo 16/12/2010, 16:12
 
Fecha de Ingreso: agosto-2008
Mensajes: 198
Antigüedad: 15 años, 8 meses
Puntos: 27
Respuesta: duda con decimal, float

Ok, muchas gracias, me has dejado todo mucho más claro.

Etiquetas: decimal, float
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 01:23.