Il 1.0/7 calcola un numero binario in virgola mobile a 17 cifre precisione. Questo accade prima il costruttore decimale vede:
>>> d = 1.0/7
>>> type(d)
<type 'float'>
>>> d.as_integer_ratio()
(2573485501354569, 18014398509481984)
La frazione binaria, 2573485501354569/18014398509481984 è il più vicino binario in virgola mobile può ottenere usando 53 bit di precisione. Non è esattamente 1/7, ma è piuttosto vicino.
Il costruttore decimale quindi converte la frazione binaria in tutte le posizioni necessarie per ottenere un equivalente decimale esatto. Il risultato che stai vedendo è quello che si ottiene quando si valuta 2573485501354569/18014398509481984 esattamente:
>>> from decimal import Decimal, getcontext
>>> getcontext().prec = 100
>>> Decimal(2573485501354569)/Decimal(18014398509481984)
Decimal('0.142857142857142849212692681248881854116916656494140625')
punto Learning 1: binario in virgola mobile calcola frazioni binarie a 53 bit di precisione. Il risultato è arrotondato se necessario.
apprendimento punto 2: Ladecimale costruttore converte i numeri in virgola mobile binari a decimali losslessly (senza arrotondamento). Ciò tende a generare molte più cifre di precisione di quanto ci si potrebbe aspettare (vedere la sesta domanda nello Decimal FAQ).
punto apprendimento 3: Il modulo decimale è stato progettato per il trattamento di tutti i numeri come esatto. Solo i risultati dei calcoli vengono arrotondati alla precisione del contesto. L'input in virgola mobile binario viene convertito in decimale esattamente e la precisione del contesto non viene applicata fino a quando non si esegue un calcolo con il numero (consultare la domanda e la risposta finali in Domande frequenti sui decimali per i dettagli).
Riepilogo: Non eseguire la divisione in virgola mobile binario prima di passare i numeri al modulo decimale. Lascia che faccia il lavoro alla tua precisione desiderata.
Spero che questo aiuti :-)
nota che indica una '0.1428571428571428' le cifre rimanenti non sono corretti –