The fractions
module in Python provides support for rational number arithmetic. It allows you to create fractions from numbers, strings, and other fractions, and perform arithmetic operations with them. This module is particularly useful in applications that require precise representation of rational numbers without floating-point inaccuracies.
This detailed guide will cover the creation of fractions, arithmetic operations, comparisons, conversions, and advanced usage of the fractions
module.
Overview of the fractions
Module
The fractions
module provides a Fraction
class that represents rational numbers as a pair of integers: a numerator and a denominator. The class ensures that the fraction is always in its simplest form.
Importing the fractions
Module
To use the fractions
module, you need to import it:
from fractions import Fraction
Creating Fractions
You can create Fraction
objects in several ways:
From Integers
You can create a fraction from two integers: the numerator and the denominator.
from fractions import Fraction
f1 = Fraction(3, 4) # Represents 3/4
f2 = Fraction(5, 1) # Represents 5/1 or simply 5
print(f1) # Output: 3/4
print(f2) # Output: 5
From Floating-Point Numbers
You can create a fraction from a floating-point number, though it’s important to note that this will convert the floating-point number to its exact fraction representation.
f3 = Fraction(0.75) # Represents 3/4
print(f3) # Output: 3/4
From Strings
You can also create a fraction from a string representation of a fraction or a decimal.
f4 = Fraction('3/4') # Represents 3/4
f5 = Fraction('0.75') # Represents 3/4
print(f4) # Output: 3/4
print(f5) # Output: 3/4
From Another Fraction
You can create a fraction from another fraction, which is useful for copying or converting between types.
f6 = Fraction(f4) # Represents 3/4
print(f6) # Output: 3/4
Arithmetic Operations
The Fraction
class supports all the standard arithmetic operations: addition, subtraction, multiplication, and division. It also supports unary operations like negation and absolute value.
Addition
f1 = Fraction(1, 2)
f2 = Fraction(1, 3)
result = f1 + f2 # Represents 5/6
print(result) # Output: 5/6
Subtraction
f1 = Fraction(3, 4)
f2 = Fraction(1, 2)
result = f1 - f2 # Represents 1/4
print(result) # Output: 1/4
Multiplication
f1 = Fraction(2, 3)
f2 = Fraction(3, 4)
result = f1 * f2 # Represents 1/2
print(result) # Output: 1/2
Division
f1 = Fraction(3, 5)
f2 = Fraction(2, 7)
result = f1 / f2 # Represents 21/10
print(result) # Output: 21/10
Unary Operations
f1 = Fraction(3, -4)
negative = -f1 # Represents 3/4
absolute = abs(f1) # Represents 3/4
print(negative) # Output: 3/4
print(absolute) # Output: 3/4
Comparisons
Fractions can be compared using all the standard comparison operators: ==
, !=
, <
, <=
, >
, and >=
.
Equality
f1 = Fraction(3, 4)
f2 = Fraction(6, 8)
print(f1 == f2) # Output: True
Inequality
f1 = Fraction(1, 3)
f2 = Fraction(1, 2)
print(f1 < f2) # Output: True
Other Comparisons
f1 = Fraction(5, 6)
f2 = Fraction(4, 5)
print(f1 > f2) # Output: True
print(f1 <= f2) # Output: False
print(f1 >= f2) # Output: True
Conversions
You can convert fractions to other numeric types such as integers and floating-point numbers, as well as back to strings.
To Integers
The Fraction
class provides methods to convert to integers, either by truncation or by rounding.
f = Fraction(7, 2)
print(f.numerator) # Output: 7
print(f.denominator) # Output: 2
print(f.numerator // f.denominator) # Output: 3 (truncated integer division)
print(f.__round__()) # Output: 4 (rounding to nearest integer)
To Floating-Point Numbers
f = Fraction(1, 3)
print(float(f)) # Output: 0.3333333333333333
To Strings
f = Fraction(7, 8)
print(str(f)) # Output: 7/8
Advanced Usage
Limiting the Denominator
The limit_denominator
method is useful when you want to approximate a fraction with a simpler denominator.
f = Fraction(3.141592653589793)
print(f.limit_denominator(1000)) # Output: 355/113
Mixed Fractions
While the fractions
module does not directly support mixed fractions (e.g., 1 1/2), you can compute and format them yourself.
f = Fraction(7, 3)
whole_number = f.numerator // f.denominator
fractional_part = Fraction(f.numerator % f.denominator, f.denominator)
print(f"{whole_number} {fractional_part}") # Output: 2 1/3
Fraction from Decimal
You can create a Fraction
from a Decimal
object to ensure precise decimal representation.
from decimal import Decimal
f = Fraction(Decimal('1.1'))
print(f) # Output: 11/10
Handling Fractions in Mathematical Functions
You can use fractions in mathematical functions from the math
module.
import math
f = Fraction(1, 4)
# Square root
sqrt_f = math.sqrt(f)
print(sqrt_f) # Output: 0.5
# Exponentiation
exp_f = f ** 2
print(exp_f) # Output: 1/16
Using Fractions in Numpy
If you are working with arrays and need exact rational number representation, you can use Fraction
with numpy arrays.
import numpy as np
from fractions import Fraction
array = np.array([Fraction(1, 3), Fraction(1, 4), Fraction(1, 5)])
print(array) # Output: [Fraction(1, 3) Fraction(1, 4) Fraction(1, 5)]
Performance Considerations
While fractions provide exact arithmetic, they can be slower than floating-point arithmetic due to the overhead of maintaining the numerator and denominator. For performance-critical applications, consider whether the precision of fractions is necessary.
Common Pitfalls
Floating-Point Representation
Creating fractions from floating-point numbers can lead to surprising results due to the inexact representation of floats.
f = Fraction(1.1)
print(f) # Output: 2476979795053773/2251799813685248
To avoid this, use strings or Decimal
objects.
Integer Division
Ensure that you use the correct division operator when working with integers to avoid unintended results.
f = Fraction(7, 2)
integer_division = f.numerator // f.denominator # Correct way for integer result
print(integer_division) # Output: 3
Practical Applications
Financial Calculations
Fractions can be useful in financial calculations where exact representation of amounts is crucial.
price_per_share = Fraction(5, 2) # $2.50
number_of_shares = 100
total_cost = price_per_share * number_of_shares
print(total_cost) # Output: 250/1 (which is 250)
Proportions and Ratios
Fractions are ideal for representing proportions and ratios exactly.
ratio = Fraction(3, 4)
total = 120
part = ratio * total
print(part) # Output: 90
Probabilities
Fractions can precisely represent probabilities.
probability_of_event = Fraction(1, 6)
print(probability_of_event) # Output: 1/6
Conclusion
The fractions
module in Python is a powerful tool for precise arithmetic with rational numbers. It supports a wide range of operations and conversions, making it suitable for various applications where accuracy is paramount. By understanding how to create, manipulate, and utilize fractions, you can harness the full potential of this module in your Python programs. Whether you’re working with financial data, mathematical computations, or any scenario requiring exact representation of ratios, the fractions
module provides a reliable and easy-to-use solution.