Автор оригинала: Doug Hellmann.
Цель:
Реализует класс для работы с рациональными числами.
Класс Fraction
реализует числовые операции для рациональных чисел на основе API, определенного Rational
в модуле numbers
.
Создание экземпляров фракции
Как и в случае с десятичным модулем, новые значения можно создавать несколькими способами. Один простой способ – создать их из отдельных значений числителя и знаменателя:
fractions_create_integers.py
import fractions for n, d in [(1, 2), (2, 4), (3, 6)]: f fractions.Fraction(n, d) print('{}/{} = {}'.format(n, d, f))
Наименьший общий знаменатель сохраняется по мере вычисления новых значений.
$ python3 fractions_create_integers.py 1/2 = 1/2 2/4 = 1/2 3/6 = 1/2
Другой способ создать Fraction
– использовать строковое представление
:
fractions_create_strings.py
import fractions for s in ['1/2', '2/4', '3/6']: f fractions.Fraction(s) print('{} = {}'.format(s, f))
Строка анализируется, чтобы найти значения числителя и знаменателя.
$ python3 fractions_create_strings.py 1/2 = 1/2 2/4 = 1/2 3/6 = 1/2
Строки также могут использовать более обычное десятичное представление или представление с плавающей запятой, состоящее из серий цифр, разделенных точкой. Поддерживается любая строка, которая может быть проанализирована с помощью float ()
и которая не представляет «не число» ( NaN
) или бесконечное значение.
fractions_create_strings_floats.py
import fractions for s in ['0.5', '1.5', '2.0', '5e-1']: f fractions.Fraction(s) print('{0:>4} = {1}'.format(s, f))
Значения числителя и знаменателя, представленные значением с плавающей запятой, вычисляются автоматически.
$ python3 fractions_create_strings_floats.py 0.5 = 1/2 1.5 = 3/2 2.0 = 2 5e-1 = 1/2
Также можно создавать экземпляры Fraction
непосредственно из других представлений рациональных значений, таких как float
или Decimal
.
fractions_from_float.py
import fractions for v in [0.1, 0.5, 1.5, 2.0]: print('{} = {}'.format(v, fractions.Fraction(v)))
Значения с плавающей запятой, которые нельзя выразить точно, могут привести к неожиданным результатам.
$ python3 fractions_from_float.py 0.1 = 3602879701896397/36028797018963968 0.5 = 1/2 1.5 = 3/2 2.0 = 2
Использование Decimal
представления значений дает ожидаемые результаты.
fractions_from_decimal.py
import decimal import fractions values [ decimal.Decimal('0.1'), decimal.Decimal('0.5'), decimal.Decimal('1.5'), decimal.Decimal('2.0'), ] for v in values: print('{} = {}'.format(v, fractions.Fraction(v)))
Внутренняя реализация Decimal
не страдает от ошибок точности стандартного представления с плавающей запятой.
$ python3 fractions_from_decimal.py 0.1 = 1/10 0.5 = 1/2 1.5 = 3/2 2.0 = 2
Арифметика
После того, как дроби созданы, их можно использовать в математических выражениях.
fractions_arithmetic.py
import fractions f1 fractions.Fraction(1, 2) f2 fractions.Fraction(3, 4) print('{} + {} = {}'.format(f1, f2, f1 + f2)) print('{} - {} = {}'.format(f1, f2, f1 - f2)) print('{} * {} = {}'.format(f1, f2, f1 * f2)) print('{} / {} = {}'.format(f1, f2, f1 / f2))
Поддерживаются все стандартные операторы.
$ python3 fractions_arithmetic.py 1/2 + 3/4 = 5/4 1/2 - 3/4 = -1/4 1/2 * 3/4 = 3/8 1/2 / 3/4 = 2/3
Приблизительные значения
Полезной функцией Fraction
является возможность преобразования числа с плавающей запятой в приблизительное рациональное значение.
fractions_limit_denominator.py
import fractions import math print('PI =', math.pi) f_pi fractions.Fraction(str(math.pi)) print('No limit =', f_pi) for i in [1, 6, 11, 60, 70, 90, 100]: limited f_pi.limit_denominator(i) print('{0:8} = {1}'.format(i, limited))
Значение дроби можно контролировать, ограничивая размер знаменателя.
$ python3 fractions_limit_denominator.py PI = 3.141592653589793 No limit = 3141592653589793/1000000000000000 1 = 3 6 = 19/6 11 = 22/7 60 = 179/57 70 = 201/64 90 = 267/85 100 = 311/99
Смотрите также
- Стандартная библиотечная документация для дробей
- decimal – модуль
decimal
предоставляет API для математических операций с фиксированной и плавающей запятой. numbers
– числовые абстрактные базовые классы.- Заметки о портировании дробей в Python 2-3