fractions — Números racionales

Source code: Lib/fractions.py


El módulo fractions provee soporte para aritmética de números racionales.

Una instancia de Fraction puede construirse desde dos enteros, desde otro número racional, o desde una cadena de caracteres.

class fractions.Fraction(numerator=0, denominator=1)
class fractions.Fraction(other_fraction)
class fractions.Fraction(float)
class fractions.Fraction(decimal)
class fractions.Fraction(string)

La primera versión necesita que numerator y denominator sean instancias de numbers.Rational y retorna una nueva instancia de Fraction con valor numerator/denominator. Si denominator es 0, esto arrojará un error ZeroDivisionError. La segunda versión necesita que other_fraction sea una instancia de numbers.Rational y retorna una instancia Fraction con el mismo valor. Las restantes dos versiones aceptan igualmente instancias float o decimal.Decimal y retornan una instancia Fraction con exactamente el mismo valor. Nota que debido a los problemas usuales con la representación binaria en punto flotante (ver Aritmética de Punto Flotante: Problemas y Limitaciones), el argumento de Fraction(1.1) no es exactamente igual a 11/10, por lo que Fraction(1.1) no retorna Fraction(11, 10) como uno esperaría. (Mira la documentación para el método limit_denominator() abajo.) La última versión del constructor espera una cadena de caracteres o una instancia Unicode. La forma usual para esta instancia es:

[sign] numerator ['/' denominator]

where the optional sign may be either “+” or “-” and numerator and denominator (if present) are strings of decimal digits (underscores may be used to delimit digits as with integral literals in code). In addition, any string that represents a finite value and is accepted by the float constructor is also accepted by the Fraction constructor. In either form the input string may also have leading and/or trailing whitespace. Here are some examples:

>>> from fractions import Fraction
>>> Fraction(16, -10)
Fraction(-8, 5)
>>> Fraction(123)
Fraction(123, 1)
>>> Fraction()
Fraction(0, 1)
>>> Fraction('3/7')
Fraction(3, 7)
>>> Fraction(' -3/7 ')
Fraction(-3, 7)
>>> Fraction('1.414213 \t\n')
Fraction(1414213, 1000000)
>>> Fraction('-.125')
Fraction(-1, 8)
>>> Fraction('7e-6')
Fraction(7, 1000000)
>>> Fraction(2.25)
Fraction(9, 4)
>>> Fraction(1.1)
Fraction(2476979795053773, 2251799813685248)
>>> from decimal import Decimal
>>> Fraction(Decimal('1.1'))
Fraction(11, 10)

La clase Fraction hereda de la clase base abstracta numbers.Rational, e implementa todos los métodos y operaciones de esa clase. Las instancias Fraction son hashable, y deben ser tratadas como inmutables. Adicionalmente Fraction tiene los siguientes métodos y propiedades:

Distinto en la versión 3.2: El constructor de Fraction ahora acepta instancias de float y decimal.

Distinto en la versión 3.9: La función math.gcd() ahora se usa para normalizar el numerator y denominator. math.gcd() siempre retorna un tipo int. Anteriormente, el tipo de GCD dependía de numerator y denominator.

Distinto en la versión 3.11: Underscores are now permitted when creating a Fraction instance from a string, following PEP 515 rules.

Distinto en la versión 3.11: Fraction implements __int__ now to satisfy typing.SupportsInt instance checks.

numerator

Numerador de la fracción irreducible.

denominator

Denominador de la fracción irreducible.

as_integer_ratio()

Retorna una tupla de dos enteros, cuyo ratio es igual a la fracción y con un denominador positivo.

Nuevo en la versión 3.8.

classmethod from_float(flt)

Alternative constructor which only accepts instances of float or numbers.Integral. Beware that Fraction.from_float(0.3) is not the same value as Fraction(3, 10).

Nota

Desde Python 3.2 en adelante, puedes construir una instancia Fraction directamente desde float.

classmethod from_decimal(dec)

Alternative constructor which only accepts instances of decimal.Decimal or numbers.Integral.

Nota

Desde Python 3.2 en adelante, puedes construir una instancia Fraction directamente desde una instancia decimal.Decimal.

limit_denominator(max_denominator=1000000)

Busca y retorna la instancia de Fraction mas cercana a self que tenga como denominador max_denominator. Este método es útil para encontrar aproximaciones racionales a un número en punto flotante determinado:

>>> from fractions import Fraction
>>> Fraction('3.1415926535897932').limit_denominator(1000)
Fraction(355, 113)

o para recuperar un numero racional que esta representado como flotante:

>>> from math import pi, cos
>>> Fraction(cos(pi/3))
Fraction(4503599627370497, 9007199254740992)
>>> Fraction(cos(pi/3)).limit_denominator()
Fraction(1, 2)
>>> Fraction(1.1).limit_denominator()
Fraction(11, 10)
__floor__()

Retorna el máximo int <= self. Este método puede accederse también a través de la función math.floor():

>>> from math import floor
>>> floor(Fraction(355, 113))
3
__ceil__()

Retorna el mínimo int >= self. Este método puede accederse también a través de la función math.ceil().

__round__()
__round__(ndigits)

La primera versión retorna el valor int mas cercano a self redondeando mitades al valor par. La segunda versión redondea self al múltiplo mas cercano de Fraction(1, 10**ndigits) (lógicamente, si ndigits es negativo), nuevamente redondeando mitades al valor par. Este método también puede accederse a través de la función round().

Ver también

Módulo numbers

Las clases base abstractas que representan la jerarquía de números.