Domanda

>>> float(str(0.65000000000000002))

0.65000000000000002

>>> float(str(0.47000000000000003))

0.46999999999999997     ???

Che cosa sta succedendo qui? Come faccio a convertire 0.47000000000000003 alla stringa e il valore risultante di nuovo a stare a galla?

Sto usando Python 2.5.4 su Windows.

È stato utile?

Soluzione

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

Nota: float(repr(0.47000000000000003)) o eval(repr(0.47000000000000003)) vi darà il risultato atteso, ma si dovrebbe usare Decimale se avete bisogno di precisione.

Altri suggerimenti

float (e doppio) non hanno la precisione infinita. Naturalmente, errori di arrotondamento si verificano quando si opera su di loro.

Questa è una Python FAQ

La stessa domanda viene in su abbastanza regolarmente in comp.lang.python anche.

Credo motivo è una FAQ è che perché pitone è perfetto in tutti gli altri aspetti ;-), ci aspettiamo di svolgere aritmetica perfetta - proprio come ci hanno insegnato a scuola. Tuttavia, come chiunque abbia fatto un corso di metodi numerici vi dirà, fluttuano i numeri in virgola sono molto lontani dalla perfezione.

decimale è una buona alternativa e se si vuole più velocità e più opzioni < a href = "http://gmpy.sourceforge.net/" rel = "nofollow noreferrer"> gmpy è troppo grande.

di questo esempio Penso che questo sia un errore in Python quando si divide

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

la via più facile, ho risolvere questo problema da questo

    >>> print(int(round(((48/5.0)-9)*5,2)))
    3
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top