Arredondamento em Python: Guia Completo com Exemplos

Está a trabalhar com dados numéricos em Python? Aprofunde os seus conhecimentos explorando as diferentes formas de arredondar números nesta linguagem.

A grande maioria dos conjuntos de dados reais contém elementos numéricos e categóricos. Existe uma vasta gama de dados numéricos, desde leituras de sensores a taxas de câmbio, sinais biomédicos e muito mais.

Ao lidar com valores numéricos, poderá ser necessário arredondá-los para uma precisão específica por diversos motivos, tais como:

  • Garantir um formato consistente.
  • Facilitar o armazenamento e o processamento.

Neste guia, vamos analisar as diferentes formas de arredondar um número para uma precisão desejada, arredondar números para cima e para baixo até ao número inteiro mais próximo e muito mais.

Vamos começar.

Como Arredondar Números com a Função Integrada round()

A maneira mais comum de arredondar números em Python é através da função integrada round(). Vamos começar por analisar a sua sintaxe:

round(num, ndigits)

Aqui:

  • num representa o número que se pretende arredondar.
  • ndigits é um parâmetro opcional, com o valor padrão sendo None. Indica o número de casas decimais para as quais o número deve ser arredondado. Se ndigits = 2, o número será arredondado para duas casas decimais.
  • A função round() retorna um número arredondado para a precisão especificada por ndigits após a vírgula decimal.

Exemplos Práticos da Função round() em Python

Vamos analisar alguns exemplos de código para perceber melhor o funcionamento da função round().

Como mencionado, o parâmetro ndigits é opcional. Portanto, ao invocar round() apenas com o número, este será arredondado para o inteiro mais próximo.

number = 7.123456
rounded = round(number)  
print(rounded)
# Saída: 7

Vejamos agora exemplos onde especificamos a precisão.

Com ndigits definido como 2, o número será arredondado para duas casas decimais (centésimos):

number = 7.123456
rounded = round(number, 2)  
print(rounded)
# Saída: 7.12

Com ndigits definido como 3, o número será arredondado para três casas decimais (milésimos):

number = 7.123456
rounded = round(number, 3)  
print(rounded)
# Saída: 7.123

Também é possível usar round() para arredondar números negativos:

number = -3.4
rounded = round(number)
print(rounded) 
# Saída: -3

Neste caso, a função arredonda -3.4 para -3, o número inteiro mais próximo.

Arredondamento para as Dezenas e Centenas Mais Próximas

Sabia que o parâmetro ndigits também pode receber valores negativos?

Sim, pode invocar a função round() com valores negativos para ndigits. Ao fazer isso, o arredondamento ocorrerá à esquerda da vírgula, e não à direita.

O que isto significa? Analisemos alguns exemplos.

Quando definimos ndigits como -1, o número será arredondado para a dezena mais próxima.

number = 7.123456
rounded = round(number, -1)  
print(rounded)
# Saída: 10.0

E invocar a função round() com ndigits definido como -2 arredonda o número 77.123456 para a centena mais próxima, que neste caso é 100.0.

number = 77.123456
rounded = round(number, -2)  
print(rounded)
# Saída: 100.0

Até agora, a função round() parece seguir os princípios de arredondamento gerais que aprendemos na escola. Mas nem sempre é assim.

Existem algumas limitações com números de ponto flutuante. Por isso, poderá encontrar resultados inesperados ao arredondar. Outra particularidade interessante é o arredondamento do banqueiro.

O que é o Arredondamento do Banqueiro?

Abra um REPL Python e experimente o seguinte exemplo:

>>> round(1.5)
2

Vemos que round(1.5) retorna 2 (como esperado). Então, o que round(2.5) deveria retornar?

>>> round(2.5)
2

Interessante, não é? Tanto round(1.5) quanto round(2.5) retornam 2. Mas como e porquê?

Internamente, a função round opera da seguinte forma: qualquer valor que esteja exatamente no ponto médio entre dois números inteiros será arredondado para o número inteiro par mais próximo. Isto é conhecido como arredondamento do banqueiro, ou arredondamento ao número par, uma estratégia para equilibrar o processo.

Sabemos que a função round() é suficiente para tarefas simples de arredondamento. Contudo, em alguns casos, poderá ser necessário arredondar um número para cima ou para baixo até ao número inteiro mais próximo.

Então, como se faz isso? Vamos analisar isso na secção seguinte.

Como Arredondar Números para Cima em Python

Para arredondar um número para o número inteiro mais próximo superior, pode utilizar:

  • A função ceil() do módulo math ou
  • O módulo decimal.

Utilizando math.ceil

A função ceil() (ou função teto) funciona da seguinte forma: arredonda um número para o menor número inteiro que seja maior do que esse número.

O excerto de código seguinte mostra como utilizar a função ceil() para arredondar o número 3.2:

import math

number = 3.2
rounded_up = math.ceil(number)
print(rounded_up)  
# Saída: 4

Utilizando o Módulo decimal

Até agora, temos usado o tipo de dados float nativo. Contudo, para certas aplicações em computação científica e finanças, necessitamos de uma precisão muito maior. Para isso, o Python oferece o módulo decimal que proporciona:

  • Aritmética de ponto flutuante mais precisa
  • Testes de igualdade mais confiáveis
  • Controlo mais preciso sobre o nível de precisão (a precisão padrão é de 28 casas decimais)

Para verificar o contexto atual, use getcontext() conforme demonstrado:

from decimal import getcontext
current_context = getcontext()
print(current_context)

Poderá verificar o modo de precisão e arredondamento atuais, entre outras coisas:

# Saída
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, 
capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])

Para arredondar um número, pode usar quantize() especificando:

  • A precisão (0, pois queremos arredondar para o número inteiro mais próximo) e
  • O modo de arredondamento: ROUND_CEILING
from decimal import Decimal, ROUND_CEILING

number = Decimal('3.2')
rounded_up = number.quantize(Decimal('0'), rounding=ROUND_CEILING)
print(rounded_up)  
# Saída: 4

Neste exemplo, o número 3.2 foi arredondado para o número inteiro 4 mais próximo.

Como Arredondar Números para Baixo em Python

Vejamos agora como arredondar números para baixo em Python. Tal como no processo de arredondamento para cima, podemos usar os módulos math ou decimal.

Utilizando math.floor

A função floor() do módulo math opera da seguinte forma: arredonda um número para o maior número inteiro inferior a esse número.

Vejamos o exemplo seguinte:

import math

number = 3.8
rounded_down = math.floor(number)
print(rounded_down)  
# Saída: 3

Neste caso, a função floor() arredonda o número de ponto flutuante 3.8 para 3.

Utilizando o Módulo decimal

Para arredondar um número para baixo, pode utilizar quantize() definindo o modo de arredondamento para ROUND_FLOOR.

from decimal import Decimal, ROUND_FLOOR

number = Decimal('3.8')
rounded_down = number.quantize(Decimal('0'), rounding=ROUND_FLOOR)
print(rounded_down)  
# Saída: 3

Como se pode observar, 3.8 foi arredondado para 3.

Armadilhas Comuns a Evitar ao Arredondar Números

Já vimos que a função round() arredonda de metade para par, o que nem sempre é o desejado. Existem algumas outras armadilhas comuns a evitar ao arredondar números em Python:

  • Comparação de igualdade incorreta: os arredondamentos geralmente introduzem erros de arredondamento. Se tentar realizar uma comparação de igualdade entre um resultado arredondado e outro valor, a verificação de igualdade (quase sempre) falhará devido à variação na precisão. Portanto, tente evitar as verificações de igualdade entre números de ponto flutuante e números de ponto flutuante arredondados. Se a comparação for necessária, introduza uma margem de tolerância.
  • Perda de informação: poderá querer que certos dados, como leituras de sensores em diferentes registos de data e hora, sejam capturados com elevada precisão. Arredondar estes dados para um menor número de casas decimais resulta em perda de informações e análises incorretas.
  • Arredondar resultados intermediários: muitas vezes, o cálculo envolverá várias etapas. Utilize uma precisão consistente em todas as etapas. Além disso, evite arredondar nas etapas intermediárias para impedir que os erros de arredondamento se agravem.

Melhores Práticas para Arredondar Números em Python

Vamos listar algumas práticas recomendadas a seguir ao arredondar números em Python:

  • Escolha o tipo de dados correto: escolha entre os tipos de dados float e decimal, dependendo da aplicação. Se precisar de realizar aritmética de ponto flutuante de alta precisão, opte pelo tipo de dados decimal.
  • Utilize níveis de precisão consistentes: defina níveis de precisão consistentes para números decimais em todo o programa para evitar erros de arredondamento inesperados.
  • Documente as técnicas de arredondamento: em aplicações reais que envolvam dados como valores monetários e leituras de sensores, é fundamental ter uma técnica de arredondamento consistente e documentada.

Conclusão

Vamos terminar este guia com uma breve revisão do que aprendemos:

  • Pode utilizar a função round() integrada com a seguinte sintaxe: round(num, ndigits). Ao utilizar a função round(), deve estar ciente da estratégia de arredondamento do banqueiro. Isto significa que arredonda os números que se encontram exatamente entre dois inteiros para o inteiro par mais próximo.
  • Pode usar as funções ceil() e floor() do módulo math para arredondar para cima e para baixo um determinado número para o número inteiro mais próximo, respetivamente.
  • Quando precisar de realizar aritmética de ponto flutuante de alta precisão, utilize o módulo decimal. Pode arredondar números com a precisão e a estratégia de arredondamento necessárias.
  • Deve estar ciente das armadilhas comuns relacionadas com o arredondamento de números em Python. Estas incluem a perda de informação devido ao arredondamento, arredondamento de resultados em etapas intermediárias e utilização de precisão diferente em diferentes partes do código.
  • As melhores práticas incluem a escolha do tipo de dados correto, dependendo da aplicação, e a documentação de níveis de precisão consistentes.

Em seguida, aprenda como realizar a divisão de inteiros em Python.

Este artigo foi útil?

Obrigado pelo seu feedback!