Comportamiento de punto flotante en Python 2.6 vs 2.7

Así que saco el intérprete de Python 2.6 y obtengo esto:

Python 2.6.6 (r266:84292, Nov 22 2013, 12:16:22) [GCC 4.4.7 20120313 (Red Hat 4.4.7-4)] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 2.1 2.1000000000000001 >>> 2.2 2.2000000000000002 >>> 2.2 2.2000000000000002 

Sin embargo, en Python 2.7 obtengo resultados más parecidos a los humanos, como a continuación:

 Python 2.7.5+ (default, Sep 19 2013, 13:48:49) [GCC 4.8.1] on linux2 Type "help", "copyright", "credits" or "license" for more information. >>> 5.4 5.4 >>> 1.1 1.1 >>> 0.2 0.2 >>> 

Me gustaría preguntar por qué sucede esto y cómo puedo hacer que Python 2.6 se comporte como 2.7.

Los métodos float.__repr__() y float.__str__() en Python 2.7 cambiaron; el método de conversión flotante a cadena de Python 3.1 fue portado hacia atrás y los valores ahora están redondeados.

El código fuente de C para float.__str__() formatea un valor de punto flotante usando el código del formateador g para la función sprintf() , con una precisión de 12 posiciones.

Para obtener el mismo resultado en Python 2.6, tendrás que formatear la cadena tú mismo:

 '%.12g' % fp_value 

o use la función format() :

 format(fp_value, '.12g') 

Tenga en cuenta que en Python 2.7 solo se modificó la representación , no los valores reales. Los valores de punto flotante son todavía aproximaciones binarias de números reales, y las fracciones binarias no siempre sumn el número exacto representado.

Si necesita tener más precisión de la que le ofrecen las aproximaciones de float , debe cambiar a usar el tipo decimal.Decimal() . Esto mantiene la precisión, al costo de la velocidad (la aritmética de punto flotante se maneja en hardware en computadoras modernas).