Article Categories
- All Categories
-
Data Structure
-
Networking
-
RDBMS
-
Operating System
-
Java
-
MS Excel
-
iOS
-
HTML
-
CSS
-
Android
-
Python
-
C Programming
-
C++
-
C#
-
MongoDB
-
MySQL
-
Javascript
-
PHP
-
Economics & Finance
Fraction module in Python
Python's fractions module provides support for rational number arithmetic. Using this module, we can create fractions from integers, floats, decimals, strings, and other numeric values.
The Fraction constructor accepts a numerator and denominator as parameters. The default numerator is 0 and the default denominator is 1. It raises ZeroDivisionError when the denominator is 0.
Creating Fraction Instances
Let's see how to create fractions using numerator and denominator values ?
from fractions import Fraction print(Fraction(45, 54)) print(Fraction(12, 47)) print(Fraction(0, 15)) print(Fraction(10)) # denominator defaults to 1
5/6 12/47 0 10
Notice how Python automatically reduces fractions to their simplest form (45/54 becomes 5/6).
Creating Fractions from Floats
You can create fractions from floating-point numbers, but the results may vary based on how you provide the input ?
from fractions import Fraction
print(Fraction(0.5))
print(Fraction(0.25))
print(Fraction(33.33)) # exact binary representation
print(Fraction('33.33')) # string representation
1/2 1/4 2345390243441541/70368744177664 3333/100
Using strings gives cleaner results because it avoids floating-point precision issues.
Creating Fractions from Strings
String arguments offer the most precise way to create fractions. They support signs and whitespace ?
from fractions import Fraction
print(Fraction('5/6'))
print(Fraction('-25.12'))
print(Fraction(' 96.251 \t\n ')) # handles whitespace
print(Fraction('3.14159265359'))
5/6 -628/25 96251/1000 314159265359/100000000000
Limiting the Denominator
Large denominators can be unwieldy. The limit_denominator() method finds the closest rational approximation with a smaller denominator ?
from fractions import Fraction
pi_fraction = Fraction('3.14159265359')
print("Original:", pi_fraction)
print("Limit 1000:", pi_fraction.limit_denominator(1000))
print("Limit 100:", pi_fraction.limit_denominator(100))
print("Limit 10:", pi_fraction.limit_denominator(10))
Original: 314159265359/100000000000 Limit 1000: 355/113 Limit 100: 311/99 Limit 10: 22/7
Accessing Numerator and Denominator
You can access the numerator and denominator components directly ?
from fractions import Fraction
frac = Fraction('36.25')
print("Fraction:", frac)
print("Numerator:", frac.numerator)
print("Denominator:", frac.denominator)
Fraction: 145/4 Numerator: 145 Denominator: 4
Mathematical Operations with Fractions
Fractions support all standard mathematical operations: addition, subtraction, multiplication, division, and exponentiation ?
from fractions import Fraction
f1 = Fraction('5/4')
f2 = Fraction('9/8')
print('Addition:', f1 + f2)
print('Subtraction:', Fraction('15/20') - Fraction('2/8'))
print('Multiplication:', Fraction('2/3') * Fraction('5/7'))
print('Division:', Fraction('80/125') / Fraction('12/45'))
print('Power:', Fraction('5/6') ** 3)
Addition: 19/8 Subtraction: 1/2 Multiplication: 10/21 Division: 12/5 Power: 125/216
Advanced Mathematical Functions
You can use fractions with Python's math module for more advanced operations ?
from fractions import Fraction
import math
frac = Fraction(36, 64)
print('Fraction:', frac)
print('Square root (float):', math.sqrt(frac))
print('Square root (fraction):', Fraction(math.sqrt(frac)).limit_denominator())
print('Floor value:', math.floor(Fraction('22/7')))
print('Ceiling value:', math.ceil(Fraction('22/7')))
Fraction: 9/16 Square root (float): 0.75 Square root (fraction): 3/4 Floor value: 3 Ceiling value: 4
Comparison of Methods
| Input Type | Example | Best For |
|---|---|---|
| Integers | Fraction(3, 4) | Exact rational numbers |
| Strings | Fraction('0.75') | Avoiding float precision issues |
| Floats | Fraction(0.75) | Simple decimals only |
Conclusion
The fractions module provides precise rational arithmetic in Python. Use strings for decimal inputs to avoid floating-point precision issues, and use limit_denominator() to get simpler approximations when needed.
