Python decimal – divisão, arredondamento, precisão

O módulo decimal do Python nos ajuda na divisão com precisão adequada e arredondamento de números.

O módulo decimal do Python

Nesta lição sobre o módulo decimal em Python, veremos como podemos gerenciar números decimais em nossos programas para precisão, formatação e cálculos. A precisão com números decimais é muito fácil de perder se os números não forem manipulados corretamente. Vamos ver como o módulo decimal e suas funções disponíveis ajudam nessas áreas.

Trabalhando com números decimais

Os números decimais são apenas números de ponto flutuante com pontos decimais fixos. Devemos arredondar os números corretamente com base em nossa necessidade, caso contrário, os resultados podem ser inesperados. O módulo decimal do Python nos ajuda a ser mais precisos com números decimais.

Necessidade do módulo decimal

Antes de realmente colocar este módulo em uso, vamos ver com que precisão estamos lidando e estabelecer por que realmente precisamos deste módulo. Olhe o trecho de código a seguir:

division = 72 / 7
print(division)

Vamos ver a saída para este programa: Bem, a resposta não foi realmente precisa e não havia pontos decimais! Vamos ver como podemos corrigir isso usando o módulo decimal.

Usando o módulo decimal

Em todos os programas que fizermos neste post, estaremos importando o módulo decimal em todos eles:

import decimal

Pode ser o caso de que só importamos uma função específica deste módulo. Isso pode ser feito como:

from decimal import Decimal

Vamos começar a inserir o módulo decimal em alguns programas.

Exemplo de módulo decimal em Python

Começaremos com exemplos relacionados ao módulo agora.

Corrigindo Divisão com Decimais

Aqui, vamos corrigir o programa que escrevemos anteriormente para realizar a divisão, a qual deveria ter produzido um resultado de ponto flutuante. O programa modificado com o módulo decimal ficará assim:

import decimal

division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)

Vamos ver a saída para este programa: Perceba que a divisão está correta agora e precisa também, ou talvez seja até demasiado precisa?

Controlando a Precisão para uma Operação Única

No último programa, havia 25 casas decimais na resposta. Mas e se quisermos apenas até três casas decimais? Isso também pode ser controlado. Aqui, vamos controlar a precisão da resposta, o que não irá refletir em outras operações em nosso programa:

import decimal

with decimal.localcontext() as ctx:
    ctx.prec = 3
    division = decimal.Decimal(72) / decimal.Decimal(7)
    print(division)

again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)

Fizemos a operação de divisão duas vezes para provar um ponto. Vamos ver a saída para este programa: Percebeu algo? A precisão que definimos foi válida apenas uma vez. Na próxima vez que fizemos a divisão, obtivemos o mesmo resultado novamente.

Controlando a precisão para o programa completo

Também é possível controlar a precisão globalmente no programa. Isso não é recomendado o tempo todo quando você está lidando com muitos números em seu programa. Aqui está um exemplo:

import decimal

decimal.getcontext().prec = 3

division = decimal.Decimal(72) / decimal.Decimal(7)
print(division)

again = decimal.Decimal(72) / decimal.Decimal(7)
print(again)

Vamos ver a saída para este programa:

Arredondando os números

É possível arredondar os números com elegância usando a função round(...). Vamos tentar:

import decimal

#Pode ser arredondado para 13,48 ou 13,49
rounded = round(13.485, 2)
print(rounded)

Vamos ver a saída para este programa: O número no programa pode ser arredondado para 13,48 ou 13,49. Por padrão, a função round(...) arredonda para baixo. Isso também pode ser alterado:

import decimal

#Pode ser arredondado para 13,48 ou 13,49
rounded = round(13.485, 2)
print(decimal.Decimal(rounded).quantize(decimal.Decimal('0.00'), rounding=decimal.ROUND_UP))

Vamos ver a saída para este programa:

Obtendo o Contexto Decimal do Python

Se estiver interessado em visualizar o contexto padrão definido para o módulo decimal, pode utilizar o seguinte script:

from decimal import *
print(getcontext())

Vamos ver a saída deste programa: Isso é tudo para o módulo decimal do Python, é muito útil ao trabalhar com números de ponto flutuante.

Source:
https://www.digitalocean.com/community/tutorials/python-decimal-division-round-precision