Python galleggiante - str - galleggiante stranezza
-
21-09-2019 - |
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.
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