[pyar] Duda con la resta

Facundo Batista facundobatista en gmail.com
Jue Jun 8 17:34:42 ART 2017


2017-06-08 16:37 GMT-03:00 Juan Carizza <juan.carizza en gmail.com>:

> Cuando trabajo con flotantes hay que tener en cuenta la cantidad de
> decimales y el redondeo..
>
> In [1]: round(2.2 - 4.3, 20)
> Out[1]: -2.0999999999999996
>
> In [2]: round(2.2 - 4.3, 1)
> Out[2]: -2.1

Es peor, incluso, cuando se trabaja con flotantes hay que tener
cuidado de que "la matemática que aprendiste en la escuela acá no
funciona".

Por ejemplo, todos sabemos que si sumás y restás el mismo número el
resultado no cambia, ¿no? Pero...

>>> 2.2 - 4.3
-2.0999999999999996
>>> 7 - 7 + 2.2 - 4.3
-2.0999999999999996
>>> 7 + 2.2 - 4.3 - 7
-2.1000000000000005

Fijate que en el último paso cambié el orden, y eso me cambió el resultado!

Por eso la recomendación siempre de si vas a hacer cuentas sobre
dinero, usá Decimal!

>>> from decimal import Decimal
>>> Decimal('2.2') - Decimal('4.3')
Decimal('-2.1')

Detalle: fijate que a Decimal le pasé un string. Decimal también
soporta que le pases un flotante directamente, pero ojo porque ahí ya
arrancás con un error....

>>> Decimal(2.2) - Decimal(4.3)
Decimal('-2.099999999999999644728632120')

...porque el flotante que le estás pasando no es el flotante que vos
creés... O sea, 2.2 no es 2.2, sino

>>> Decimal(2.2)
Decimal('2.20000000000000017763568394002504646778106689453125')

Slds.

-- 
.    Facundo

Blog: http://www.taniquetil.com.ar/plog/
PyAr: http://www.python.org/ar/
Twitter: @facundobatista


Más información sobre la lista de distribución pyar