[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