Python float equidad equidad

Viendo algún comportamiento inesperado con Python esta noche. ¿Por qué la siguiente impresión es ‘no igual’?

num = 1.00 num -= .95 nickel = .05 if nickel != num: print 'not equal' else: print 'equal' 

Lo que todo científico informático debe saber sobre la aritmética de punto flotante .

 >>> num = 1.00 >>> num 1.0 >>> num -= 0.95 >>> num 0.050000000000000044 >>> nickel = .05 >>> nickel 0.05 

Puede que encuentre útil el módulo decimal .

 >>> TWOPLACES = Decimal(10) ** -2 >>> Decimal(1).quantize(TWOPLACES)-Decimal(0.95).quantize(TWOPLACES) == Decimal(0.05).quantize(TWOPLACES) True 

O alternativamente:

 import decimal decimal.getcontext().prec = 2 decimal.Decimal(1.00) - decimal.Decimal(0.95) 

A partir de tu nombre de la variable de nickel deduje que estabas pensando en el dinero. Obviamente, el punto flotante es el tipo incorrecto para eso.

Este es un problema común de punto flotante con las computadoras. Tiene que ver con cómo la computadora almacena los números de punto flotante. Yo sugeriría leer rápidamente lo que todo científico informático debería saber sobre la aritmética de punto flotante .