As a project, I am creating a Rational Class from scratch that can take two fractions as input and store the simplified fraction. However, when I attempt to input two fractions, it appears to use integer division implicitly, so I can't store/manipulate the fraction at all. Am I approaching the problem incorrectly? Where is the mistake?
Example: Rational(3/2,9/2) returns (1,4) rather than (1/3).
def gcd(numerator,denominator):
if numerator < 0:
absNum = -numerator
elif denominator < 0:
absDen = -denominator
else:
absNum = numerator
absDen = denominator
while absNum != absDen:
if absNum > absDen:
absNum = absNum - absDen
elif absDen >= absNum:
absDen = absDen - absNum
return(absNum)
class Rational:
def __init__(self,numerator=0,denominator=1):
self.numerator = numerator
self.denominator = denominator
if denominator == 0:
raise ZeroDivisionError("Error: cannot store number with 0 in denominator.")
elif denominator < 0:
if numerator < 0:
self.denominator = -denominator
self.numerator = -numerator
else:
self.numerator = numerator
self.denominator = -denominator
if numerator != 0:
com = gcd(numerator,denominator)
numerator = numerator/com
denominator = denominator/com
self.numerator = numerator
self.denominator = denominator
Rational(5/3,8/3)
Returns (1,2) instead of, (5,8) as it should. EDIT: The second half: I want to be able to input Rational(Rational(5/3),Rational(8/3)) with (5,8) the result. This seems slightly different from the above.
from __future__ import division
will fix the division problem.
Side note - if you want your rationals to be stored precisely, you should make sure the numerator and denominator are both being stored as ints. If I'm reading it correctly, your gcd function won't work with floats.
To solve this problem you might want to do something like:
def __init__(self, num, den):
num1, den1 = float(num).as_integer_ratio()
den2, num2 = float(den).as_integer_ratio()
self.numerator = num1 * num2
self.denominator = den1 * den2
...