[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