[Python] Richiesta chiarimento per calcoli con numeri decimali

Daniele Varrazzo piro a develer.com
Mar 14 Apr 2015 09:43:41 CEST


On 2015-04-14 00:26, Carpediem wrote:
> Ho un problema su cui sicuramente qualcuno di voi saprà fornirmi una 
> risposta.
> Per quel che mi riguarda, ho perso tre giorni prima di scoprire un
> comportamento sul modo di contare di python che mi porta a risultati
> fuorvianti. Ecco il punto:
> sb = 3287628061
> mb = sb / 60 # con la calcolatrice ottengo 54793801.01666667
> m1 = int(mb) # ottengo 54793801
> s = int ((mb-m1)*60 # Con la calcolatrice ottengo 1 ma python
> restituisce alla variabile s il valore di 0,9999999403953552 e quindi
> 0
> 
> A questo punto, quindi, se chiedo di stampare s invece che ritrovarmi
> il valore 1 ottengo 0
> utilizzando una comune calcolatrice, o quella fornita dallo stesso
> windows, ciò che ottengo effettuando 3287628061/60 è 54793801,01666667
> Se invece chiedo a Python di stamparmi il risultato, dopo la virgola
> ottengo 01 e una serie di 6 senza che compaia il 7 finale.
> Tale differenza, quando chiedo di determinare il valore intero di s,
> comporta il mancato raggiungimento del valore di unità (che invece
> dovrei ottenere) producendo tutta una serie di conseguenze errate a
> catena sui risultati delle operazioni successive.
> Qualcuno potrebbe avere la gentilezza di spiegarmi questo 
> comportamento?
> e soprattutto, c'è un modo per chiedere un arrotondamento in eccesso
> per la n cifra decimale?

Ci sono corsi universitari interi sul comportamento dei numeri in 
virgola mobile. In breve: non sono precisi. In meno breve, una rapida 
googlata ti porta diversi esempi

https://www.google.co.uk/webhp?#q=floating+point+number+problems

Questo sembra divertente, poi me lo guardo: 
http://floating-point-gui.de/

> So che potrei ottenere un numero intero utilizzando per la divisione
> l'operatore // ma sono particolarmente interessato a capire e
> risolvere il problema contemplando l'utilizzo dei numeri in virgola
> mobile.

Usa round() invece di int() per convertire il numero all'intero più 
vicino.

-- Daniele


Maggiori informazioni sulla lista Python