El módulo «fractions» – Números racionales



Este módulo provee soporte para fracciones a nivel estándar. Se incluye desde la versión 2.6, y actualmente presenta total compatibilidad y similitud con Python 3.

Se constituye una fracción creando una instancia de la clase fractions.Fraction, la única en el módulo. Se trata de un componente pequeño y fácil de utilizar. La clase permite varios métodos de construcción. Uno de los más confiables es a partir de una cadena, de la siguiente manera:

a = Fraction("3/5")  # Tres quintos
b = Fraction("-4/7")  # Cuatro séptimos (negativo)
c = Fraction("8")  # Ocho enteros. Se omite el denominador, uno por defecto.

Por lo tanto, la sintaxis es [signo] numerador [/ denominador], siendo los elementos entre corchetes opcionales. En caso de pasar un parámetro incorrecto, las excepciones ValueError y ZeroDivisionError (si el denominador es 0) son lanzadas. Por ejemplo, el siguiente código solicita una fracción y luego la imprime.

#!/usr/bin/env python
# -*- coding: utf-8 -*-

from fractions import Fraction

# Compatibilidad entre versiones
try:
    input = raw_input
except NameError:
    pass

while True:
    input_value = input("Ingrese una fracción (-3/5, por ejemplo): ")
    try:
        fraction = Fraction(input_value)
    except ValueError:
        print("¡Eso no es una fracción!")
    except ZeroDivisionError:
        print("El denominador no puede ser 0.")
    else:
        break

print(fraction)

Nótese que las fracciones ingresadas son llevadas a su mínima expresión automáticamente. Por ejemplo, 30/50 es llevada a 3/5 (tres quintos); 60/10 es llevada a 6 (seis enteros). El código es compatible con ambas versiones.

Además, la clase permite construir las fracciones pasando numerador y denominador como números individuales:

a = Fraction(7, 6)  # Siete sextos = 7/6

Puedes comprobar la eficacia de este método realizando:

>>> a = Fraction(7, 6)
>>> print a
7/6
>>> str(a)
'7/6'

Y por último puede construirse a partir de un número de coma flotante o decimal; el algoritmo de conversión se realiza automáticamente. Por ejemplo:

>>> a = Fraction(11.5)
>>> print a
23/2

Si tu pregunta es por qué la fracción resultante es 23/2, la respueta es que 11,5 se expresa como la fracción 115/10 y a su vez ésta se reduce a su mínima expresión (numerador y denominador se dividen por 5).

Si has intentado otro número y el resultado se ve algo extraño, se debe a los errores y limitaciones de los números de coma flotante explicados en este artículo (en inglés). Es por esto que recomiendo usar los métodos anteriores. Algunos ejemplos:

>>> Fraction(0.3)
Fraction(5404319552844595, 18014398509481984)
>>> Fraction(5.6)
Fraction(3152519739159347, 562949953421312)
>>> Fraction(1.2)
Fraction(5404319552844595, 4503599627370496)

Tanto numerador como denominador pueden ser accedidos desde la misma instancia:

>>> a = Fraction(2, 7)
>>> a.numerator
2
>>> a.denominator
7

Ahora puedes realizar operaciones aritméticas normalmente:

>>> a = Fraction(3, 5)
>>> b = Fraction(1, 2)
>>> a + b
Fraction(11, 10)
>>> a / b
Fraction(6, 5)
>>> a * b
Fraction(6, 5)
>>> a - b
Fraction(1, 10)

Finalmente, el módulo añade la función gcd (greatest common divisor, divisor común mayor o factor común) que retorna justamente lo que indica su nombre. Por ejemplo:

>>> gcd(5, 10)
5
>>> gcd(17, 100)
1
>>> gcd(16, 100)
4

Versión

Python 2, Python 3



4 comentarios.

Deja una respuesta