Python Decimal

Da Andreabont's Wiki.

Come è noto, il problema della virgola mobile nei computer moderni è che la loro rappresentazione binaria non è sempre possibile, e spesso viene automaticamente usata una approssimazione, questo può non essere un problema in molti casi, ma lo diventa quando la precisione diventa rilevante.

Con l'interprete di python possiamo subito farci un idea del problema, sommando 0.1 e 0.2 ci aspetteremmo 0.3, invece otteniamo una sua approssimazione:

>>> 0.1 + 0.2
0.30000000000000004

Soluzioni

Per ovviare a questo problema ci sono i seguenti modi:

Lavorare con gli interi

Possiamo usare il "trucco" di lavorare con gli interi portando i numero a non avere nulla dopo la virgola:

>>> (0.1 * 10 + 0.2 * 10) / 10
0.3

Decimal

Oppure utilizziamo il modulo "decimal" di python, che permette di avere una rappresentazione precisa dei numeri decimali.

from decimal import *
getcontext().prec = 28 # Opzionale, è possibile definire la precisione voluta

Questo modulo aggiunge l'oggetto Decimal, che accetta un numero qualsiasi e mostra il suo esatto valore, se gli si passa un float mostrerà il numero approssimato salvato:

>>> Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

Se invece si passa un numero in formato di stringa, ci salverà il numero che esattamente vogliamo rappresentare:

>>> Decimal('0.1') + Decimal('0.2')
Decimal('0.3')