[TiLUG] Python - Arrotondare valori numerici
Luigi Panzeri aka Matley
matley@muppetslab.org
Dom 4 Feb 2007 20:32:51 CET
"Matteo Pasotti" <matteo.pasotti@gmail.com> writes:
> e fin qui tutto ok, in realtà non capisco bene il comportamento che ha
> in casi come quello che segue:
>>>> round(654.255689, 2)
> 654.25999999999999
>
Il "problema" si verifica infatti anche se digiti al prompt 654.26
(senza round) e dipende ovviamente da come i computer preferiscono
lavorare, per motivi di efficienza, con i numeri con la virgola.
Qui puoi trovare una spiegazione semplice (con un esempio simile al
tuo in mezzo al documento): http://docs.python.org/tut/node16.html
Se vuoi una trattazione piu' completa sul tema a me ha insegnato molto
questo paper:
http://cch.loria.fr/documentation/IEEE754/ACM/goldberg.pdf
Se ti interessa solo una rappresentazione bella dei float usa str
invece che repr:
> print str(round(654.255689, 2))
654.26
Se invece ti interessa lavorare con numeri 'decimali' (solitamente ti
interessa se devi contare i soldi) usa il modulo decimal che fornisce
il tipo di dato Decimal. Comunemente i float sono la migliore scelta.
D'altra parte solitamente quando uno scrive 654.255689 intende un
numero che misura una quantita' vicina a quella fornita oppure
intende precisamente 654255689/1000000 ?
Ciao
--
Luigi Panzeri aka Matley
Chiave pubblica su http://www.imati.cnr.it/~panzeri/matley.asc
Why Lisp? http://alu.cliki.net/RtL%20Highlight%20Film
Evaluate Lisp: http://lisp.tech.coop/Evaluate%20Lisp
Maggiori informazioni sulla lista
TiLUG