2009-11-22 20 views
8
>>> float(str(0.65000000000000002)) 

0.65000000000000002 

>>> float(str(0.47000000000000003)) 

0.46999999999999997  ??? 

Cosa sta succedendo qui? Come convertire 0.47000000000000003 in stringa e il valore risultante in virgola mobile?Python float - str - float weirdness

Sto usando Python 2.5.4 su Windows.

+1

aggiunto IEEE 754-tag –

+3

RC: Penso che molte persone (sì, anche i programmatori) non sappiano che IEEE 754 definisce numeri in virgola mobile (non tutti leggono le specifiche della lingua :-)). Quindi penso che il tag "floating-point" sarebbe una scelta migliore a meno che non ci siano domande specifiche sullo standard stesso. – Joey

+5

sicuramente quelli che fanno questo tipo di domande non sanno cosa sia l'ieee-754 ... – sth

risposta

16

str(0.47000000000000003) dare '0.47' e float('0.47') può essere 0.46999999999999997. Ciò è dovuto al modo in cui il numero in virgola mobile sono rappresentati (vedi questo articolo wikipedia)

Nota: float(repr(0.47000000000000003)) o eval(repr(0.47000000000000003)) vi darà i risultati sperati, ma si dovrebbe utilizzare Decimal se avete bisogno di precisione.

+0

Grazie, buono a sapersi! – Sharun

+0

Nota: utilizzare decimale qui non solo per precisione ma anche per precisione. – Joey

+0

Non sono sicuro, ma percepisco "precisione" e "esattezza" come sinonimi, essendo la precisione il termine abituale. – tzot

3

float (e doppio) non hanno una precisione infinita. Ovviamente, gli errori di arrotondamento si verificano quando si opera su di essi.

2

Questo è un Python FAQ

La stessa domanda viene in su quite regularly in comp.lang.python anche.

Penso che sia una FAQ è che poiché python è perfetto sotto tutti gli altri aspetti ;-), ci aspettiamo che esegua l'aritmetica perfettamente - proprio come ci è stato insegnato a scuola. Tuttavia, come vi diranno tutti coloro che hanno fatto un corso sui metodi numerici, i numeri in virgola mobile sono molto lontani dal perfetto.

Decimal è una buona alternativa e se si desidera più velocità e più opzioni gmpy è ottimo.

0

da questo esempio Credo che questo sia un errore in Python quando si dividere

>>> print(int(((48/5.0)-9)*5)) 
    2 

la via più facile, risolvo questo problema questo

>>> print(int(round(((48/5.0)-9)*5,2))) 
    3