2012-02-22 10 views
5

Mentre nei guai con Python,Perché il float degli oggetti in Python non ha un attributo denominatore, mentre int lo fa?

>>> [attr for attr in dir(1) if not attr.startswith('_')] 
['bit_length', 'conjugate', 'denominator', 'imag', 'numerator', 'real'] 
>>> [attr for attr in dir(1.1) if not attr.startswith('_')] 
['as_integer_ratio', 'conjugate', 'fromhex', 'hex', 'imag', 'is_integer', 'real'] 

Pur comprendendo che 'coniugato', 'imag', e 'vero' sono lì per motivi di compatibilità con tipo complesso, non riesco a capire perché 'numeratore' e 'denominatore' esistono solo per int e non per un float.

Qualche spiegazione?

+3

Che cosa vi aspettate 'math.pi.denominator' di tornare? – dan04

+0

Direi 7, ma dopo Wikipedia ho capito che il pi è un numero irrazionale e non corrisponde esattamente alla versione razionale 22/7. – Radian

risposta

5

Questo è più probabile perché i galleggianti sono in qualche modo dispersivi - non possono rappresentare perfettamente ogni valore. Considerate questo esempio:

>>> 1.0/5.0 
0.20000000000000001 

Se si voleva l'accesso al denominatore del 1.0/5.0 pitone sarebbe dovuto tornare 18014398509481984 (20000000000000001/100000000000000000 == 3602879701896397/18014398509481984). La perdita di precisione farà sì che Python non abbia altra scelta che restituire valori pazzeschi, quindi i progettisti hanno scelto di non implementare la funzione.

+0

Intendi '3602879701896397/18014398509481984'. – dan04

+0

perché sì, grazie. –

5

Date un'occhiata al numero di gerarchia di classe: Python numbers

numbers.Integral è una classe secondaria di numbers.Rational

E 'numbers.Rational che aggiunge i membri numeratore e denominatore.

2

Questo perché int è una sottoclasse di rational e non lo è float. Dal rational ha un attributo denominatore, int ereditato.

Si può leggere di più here

Problemi correlati