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)

The first version requires that numerator and denominator are instances of numbers.Rational and returns a new Fraction instance with value numerator/denominator. If denominator is 0, it raises a ZeroDivisionError. The second version requires that other_fraction is an instance of numbers.Rational and returns a Fraction instance with the same value. The next two versions accept either a float or a decimal.Decimal instance, and return a Fraction instance with exactly the same value. Note that due to the usual issues with binary floating-point (see Aritmética de Punto Flotante: Problemas y Limitaciones), the argument to Fraction(1.1) is not exactly equal to 11/10, and so Fraction(1.1) does not return Fraction(11, 10) as one might expect. (But see the documentation for the limit_denominator() method below.) The last version of the constructor expects a string or unicode instance. The usual form for this instance is:

[sign] numerator ['/' denominator]

donde el sign opcional puede ser “+” o “-” y numerator y denominator (si están presentes) son cadenas de caracteres de dígitos decimales (guiones bajos se pueden usar para delimitar dígitos como con las integrales literales en el código). Además, cualquier cadena de caracteres que represente un valor finito y sea aceptado por el constructor de float también es aceptado por el constructor de Fraction. En cualquier caso, la cadena de caracteres de entrada también puede tener espacios en blanco iniciales y / o finales. Aquí hay unos ejemplos:

>>> 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)

The Fraction class inherits from the abstract base class numbers.Rational, and implements all of the methods and operations from that class. Fraction instances are hashable, and should be treated as immutable. In addition, Fraction has the following properties and methods:

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: Ahora se permiten guiones bajos al crear una instancia de Fraction a partir de una cadena de caracteres, siguiendo las reglas de PEP 515.

Distinto en la versión 3.11: Fraction ahora implementa __int__ para satisfacer las comprobaciones de instancia de typing.SupportsInt.

Distinto en la versión 3.12: Space is allowed around the slash for string inputs: Fraction('2 / 3').

Distinto en la versión 3.12: Fraction instances now support float-style formatting, with presentation types "e", "E", "f", "F", "g", "G" and "%"".

numerator

Numerador de la fracción irreducible.

denominator

Denominador de la fracción irreducible.

as_integer_ratio()

Return a tuple of two integers, whose ratio is equal to the original Fraction. The ratio is in lowest terms and has a positive denominator.

Nuevo en la versión 3.8.

is_integer()

Return True if the Fraction is an integer.

Nuevo en la versión 3.12.

classmethod from_float(flt)

Constructor alternativo que solo acepta instancias de float o numbers.Integral. Ten cuidado que Fraction.from_float(0.3) no es lo mismo que Fraction(3, 10).

Nota

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

classmethod from_decimal(dec)

Constructor alternativo que solo acepta instancias de decimal.Decimal o 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().

__format__(format_spec, /)

Provides support for float-style formatting of Fraction instances via the str.format() method, the format() built-in function, or Formatted string literals. The presentation types "e", "E", "f", "F", "g", "G" and "%" are supported. For these presentation types, formatting for a Fraction object x follows the rules outlined for the float type in the Especificación de formato Mini-Lenguaje section.

Here are some examples:

>>> from fractions import Fraction
>>> format(Fraction(1, 7), '.40g')
'0.1428571428571428571428571428571428571429'
>>> format(Fraction('1234567.855'), '_.2f')
'1_234_567.86'
>>> f"{Fraction(355, 113):*>20.6e}"
'********3.141593e+00'
>>> old_price, new_price = 499, 672
>>> "{:.2%} price increase".format(Fraction(new_price, old_price) - 1)
'34.67% price increase'

Ver también

Módulo numbers

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