Flotador de Python a relación

Intento obtener ración de variable y obtengo un resultado inesperado. ¿Alguien puede explicar esto?

>>> value = 3.2 >>> ratios = value.as_integer_ratio() >>> ratios (3602879701896397, 1125899906842624) >>> ratios[0] / ratios[1] 3.2 

Yo usando python 3.3

Pero creo que (16, 5) es una solución mucho mejor.

Y por qué es correcto para 2.5

 >>> value = 2.5 >>> value.as_integer_ratio() (5, 2) 

Usa el módulo de fractions para simplificar las fracciones:

 >>> from fractions import Fraction >>> Fraction(3.2) Fraction(3602879701896397, 1125899906842624) >>> Fraction(3.2).limit_denominator() Fraction(16, 5) 

Desde la función Fraction.limit_denominator() :

Encuentra y devuelve la Fraction más cercana a self que tiene denominador como máximo max_denominator. Este método es útil para encontrar aproximaciones racionales a un número de punto flotante dado

Los números de punto flotante tienen una precisión limitada y no pueden representar muchos números exactamente ; Lo que ves es una representación redondeada, pero el número real es:

 >>> format(3.2, '.50f') '3.20000000000000017763568394002504646778106689453125' 

porque un número de punto flotante se representa como una sum de fracciones binarias; 1/5 solo puede representarse sumndo 1/8 + 1/16 + 1/128 + más fracciones binarias para boost exponentes de dos.

No es 16/5 porque 3.2 no es 3.2 exactamente … es una aproximación aproximada de punto flotante … por ejemplo: 3.20000000000000017764