Domingo, 4 de Maio de 2008

Python 2.4: Decimal

A forma com que números decimais são armazenados na memória do computador faz com que algumas vezes a representação deles psra nós seja inexata. Por exemplo, ao abrir o interpretador python:
>>> 1.1
1.1000000000000001

>>> 1.1+1.1
2.2000000000000002


No caso dos bancos de dados, por exemplo, o armazenamento desses números serial feito com o tipo DECIMAL ao NUMERIC, ao invés do float. Um exemplo de uso seria aplicações financeiras.

No Python 2.4 um novo tipo de dados foi adicionado, o Decimal, que permite a representação desses números de forma exata. Um exemplo!

Python 2.5.1 (r251:54863, Mar  7 2008, 03:39:23)
[GCC 4.1.3 20070929 (prerelease) (Ubuntu 4.1.2-16ubuntu2)] on linux2
Type "help", "copyright", "credits" or "license" for more information.

>>> import decimal
>>> decimal.Decimal("1.1")
Decimal("1.1")

>>> a = decimal.Decimal("1.1")
>>> a+a
Decimal("2.2")
>>> print(a+a)
2.2

>>>

Você pode ler mais sobre isso em http://www.python.org/doc/2.4.3/whatsnew/node9.html.

3 comentários:

La Batalema Pitonisto disse...

Legal.

Já conhecia Decimal.

Interessante lembrar que em Common Lisp há o tipo número (number).

Por exemplo:
> (/ 11 10)
11/10

Daí podemos ter uma precisão interessante:

> (setq num(+ 11/10 11/10))
11/5
> (float num)
2.2

[]'s
Cacilhas, La Batalema

Humberto Diógenes disse...

Você sabe que é nerd quando...
...vai digitar "seria" e acaba digitando "serial". :D

"o armazenamento desses números serial feito"

claudiotorcato disse...

Eu utilizo Decimal nas minhas aplicações. Eu também costumo usar o módulo decimal.getcontext para configurar a precisão dentro de um módulo. Ex.:

from decimal import getcontext

getcontext.prec = 2