[Python] Richiesta chiarimento per calcoli con numeri decimali

Marco Santamaria marco.santamaria a gmail.com
Mar 14 Apr 2015 09:56:58 CEST


Ho trovato utili questi articoli:

   - http://docs.oracle.com/cd/E19957-01/806-3568/ncg_goldberg.html
   - http://www.lahey.com/float.htm
   - https://docs.python.org/2/tutorial/floatingpoint.html
   - http://www.lightbird.net/py-by-example/decimal-module.html

Nei casi in cui ci si scontra con questi problemi a volte è il caso di
usare Decimal invece di float

Marco

Il giorno 14 aprile 2015 09:43, Daniele Varrazzo <piro a develer.com> ha
scritto:

> 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
>
> _______________________________________________
> Python mailing list
> Python a lists.python.it
> http://lists.python.it/mailman/listinfo/python
>
-------------- parte successiva --------------
Un allegato HTML è stato rimosso...
URL: <http://lists.python.it/pipermail/python/attachments/20150414/849a2d17/attachment.html>


Maggiori informazioni sulla lista Python