Ver Mensaje Individual
  #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.