El 1,0/7 calcula un número de punto flotante binario de 17 dígitos de precisión. Esto sucede antes de la decimal constructor ve:
>>> d = 1.0/7
>>> type(d)
<type 'float'>
>>> d.as_integer_ratio()
(2573485501354569, 18014398509481984)
La fracción binaria, 2573485501354569/18014398509481984 es lo más cerca que el punto flotante binario puede conseguir usando 53 bits de precisión. No es exactamente 1/7, pero está bastante cerca.
El constructor Decimal luego convierte la fracción binaria en tantos lugares como sea necesario para obtener un equivalente decimal exacto. El resultado que está viendo es lo que se obtiene cuando se evalúa 2573485501354569/18014398509481984 exactamente:
>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 100
>>> Decimal(2573485501354569)/Decimal(18014398509481984)
Decimal('0.142857142857142849212692681248881854116916656494140625')
punto de Aprendizaje 1: punto flotante binario calcula fracciones binarias de 53 bits de precisión. El resultado se redondea si es necesario.
punto de aprendizaje 2: El decimal constructor convierte números de punto flotante binario a decimales sin pérdidas (sin redondeo). Esto tiende a generar muchos más dígitos de precisión de los que cabría esperar (consulte la 6ª pregunta en el Decimal FAQ).
punto de aprendizaje 3: El módulo decimal está diseñado para tratar todos los números como exacta. Solo los resultados de los cálculos se redondean a la precisión del contexto. La entrada del punto flotante binario se convierte exactamente a decimal y la precisión del contexto no se aplica hasta que realice un cálculo con el número (consulte la pregunta y respuesta finales en las Preguntas frecuentes sobre decimales para obtener más información).
Resumen ejecutivo: No realice la división de coma flotante binaria antes de pasar los números al módulo decimal. Deje que haga el trabajo con la precisión deseada.
Esperanza esto ayuda :-)
Tenga en cuenta que es sólo exacta a '0.1428571428571428' los dígitos restantes no son correctos –