Computação de fracções (números racionais) com fracções

O negócio

Utilizando o módulo de fracções da biblioteca Python padrão, é possível efectuar cálculos com fracções (números racionais).

Explica-se aqui o seguinte.

  • Construtor de Fracções
  • Obter valores numeradores e denominadores como números inteiros
  • Computação e comparação de fracções (números racionais)
  • Conversão de fracções em decimais (float)
  • Conversão de fracção em fio (str)
  • Obter uma aproximação racional do número

Construtor de Fracções

Há várias maneiras de criar uma instância de fracção. Em todos os casos, a fracção é automaticamente dividida em fracções.

Especificar numerador e denominador como números inteiros

Especificar o numerador e denominador como números inteiros, respectivamente. Se o denominador for omitido, assume-se que é 1.

from fractions import Fraction

print(Fraction(1, 3))
# 1/3

print(Fraction(2, 6))
# 1/3

print(Fraction(3))
# 3

fracção decimal (float)

Se um valor fracionário for passado, é convertido numa fracção.

print(Fraction(0.25))
# 1/4

print(Fraction(0.33))
# 5944751508129055/18014398509481984

Se desejar uma aproximação especificando um denominador máximo, utilize o método limit_denominator() descrito abaixo.

cadeia de caracteres (str)

Se um valor de cadeia for passado, é convertido numa fracção.

print(Fraction('2/5'))
# 2/5

print(Fraction('16/48'))
# 1/3

Obter valores numeradores e denominadores como números inteiros

Os atributos do tipo Fracção permitem obter valores inteiros para o numerador e denominador, respectivamente. Não podem ser alterados.

  • numerator
  • denominator
a = Fraction(1, 3)
print(a)
# 1/3

print(a.numerator)
print(type(a.numerator))
# 1
# <class 'int'>

print(a.denominator)
print(type(a.denominator))
# 3
# <class 'int'>

# a.numerator = 7
# AttributeError: can't set attribute

Computação e comparação de fracções (números racionais)

Os operadores aritméticos podem ser utilizados para calcular adição, subtracção, etc.

result = Fraction(1, 6) ** 2 + Fraction(1, 3) / Fraction(1, 2)
print(result)
print(type(result))
# 25/36
# <class 'fractions.Fraction'>

Os operadores de comparação também podem ser utilizados.

print(Fraction(7, 13) > Fraction(8, 15))
# True

Conversão de fracções em decimais (float)

Pode converter de fracções para decimais com flutuador().

a_f = float(a)
print(a_f)
print(type(a_f))
# 0.3333333333333333
# <class 'float'>

Quando calculado com um número decimal, é automaticamente convertido para um tipo de flutuador.

b = a + 0.1
print(b)
print(type(b))
# 0.43333333333333335
# <class 'float'>

Conversão de fracção em fio (str)

Para converter para uma corda, usar str().

a_s = str(a)
print(a_s)
print(type(a_s))
# 1/3
# <class 'str'>

Obter uma aproximação racional do número

Uma aproximação racional do número pode ser obtida com o método limit_denominator() do tipo Fraction.

Retorna o número racional (fracção) cujo denominador é inferior ou igual ao argumento max_denominador. Se omitido, max_denominador=1000000.

Números irracionais aproximados, tais como pi e Napier número e

pi = Fraction(3.14159265359)
print(pi)
# 3537118876014453/1125899906842624

print(pi.limit_denominator(10))
print(pi.limit_denominator(100))
print(pi.limit_denominator(1000))
# 22/7
# 311/99
# 355/113

e = Fraction(2.71828182846)
print(e)
# 6121026514870223/2251799813685248

print(e.limit_denominator(10))
print(e.limit_denominator(100))
print(e.limit_denominator(1000))
# 19/7
# 193/71
# 1457/536

Converter decimais circulares em fracções

a = Fraction(0.565656565656)
print(a)
# 636872674577009/1125899906842624

print(a.limit_denominator())
# 56/99

a = Fraction(0.3333)
print(a)
# 6004199023210345/18014398509481984

print(a.limit_denominator())
print(a.limit_denominator(100))
# 3333/10000
# 1/3