[Python] Un aiuto per neofita alle prime armi

Daniele Varrazzo piro a develer.com
Ven 20 Gen 2012 13:43:37 CET


On Fri, 20 Jan 2012 13:13:46 +0100, Giovanni Porcari wrote:
> Il giorno 20/gen/2012, alle ore 12:39, Daniele Varrazzo ha scritto:
>
>> Non mi sembra proprio: Gianni sta facendo una divisione, non una 
>> somma di milioni in cui deve mantenere i decimali.
>
>
> Perchè parli di somma di milioni ? Non mi è chiaro...
>
>
> Credevo che il problema fosse :
>
>
>>>> y=0.1
>>>> y*3
> 0.30000000000000004
>
>>>> x=Decimal('0.1')
>>>> x*3
> Decimal('0.3')
>
>
> E in effetti se al fisico o all'ingegnere la cosa va benone,
> il contabile preferisce un maggior 'controllo' ;)

Certo. Ma l'OP non ha richiesto un problema di contabilità: solo una 
divisione.


     In [1]: import ystockquote

     In [3]: prezzo = ystockquote.get_price("ftsemib.mi")

     In [4]: change = ystockquote.get_change("ftsemib.mi")

     In [5]: prezzo
     Out[5]: '15586.960'

     In [6]: change
     Out[6]: '-61.610'

     In [7]: float(prezzo) / float(change)
     Out[7]: -252.99399448141534

     In [9]: from decimal import Decimal

     In [10]: Decimal(prezzo) / Decimal(change)

     Out[10]: Decimal('-252.9939944814153546502191203')


Che ci ha guadagnato, in [10], rispetto a [7]?

Invece ecco cosa ci ha perso:


     In [11]: prezzo = float(ystockquote.get_price("ftsemib.mi"))

     In [12]: change = float(ystockquote.get_change("ftsemib.mi"))

     In [13]: print "%0.2f" % (100.0*change/(prezzo - change))
     -0.41

     In [14]: prezzo = Decimal(ystockquote.get_price("ftsemib.mi"))

     In [15]: change = Decimal(ystockquote.get_change("ftsemib.mi"))

     In [16]: print "%0.2f" % (100.0*change/(prezzo - change))
     
---------------------------------------------------------------------------
     TypeError                                 Traceback (most recent 
call last)

     /home/piro/src/<ipython console> in <module>()

     TypeError: unsupported operand type(s) for *: 'float' and 'Decimal'


Se proprio uno vuole precisione assouluta, tuttalpiù ci vogliono i 
razionali. I decimali sono il tipo di dati adatto a molti problemi... ma 
non a questo.


-- 
Daniele Varrazzo - Develer S.r.l.
http://www.develer.com


Maggiori informazioni sulla lista Python