作为一个项目,我从头开始创建一个Rational类,它可以将两个分数作为输入并存储简化分数。但是,当我尝试输入两个分数时,它似乎隐式使用整数除法,所以我根本不能存储/操作分数。我是否错误地接近了这个问题?错误在哪里?
示例:Rational(3 / 2,9 / 2)返回(1,4)而不是(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)
返回(1,2)而不是(5,8)。 编辑:下半部分:我希望能够用(5,8)结果输入Rational(Rational(5/3),Rational(8/3))。这似乎与上面略有不同。
答案 0 :(得分:2)
from __future__ import division
将解决分裂问题。
旁注 - 如果您希望精确存储您的有理数,则应确保分子和分母都存储为整数。如果我正确读取它,你的gcd函数将无法使用浮点数。
要解决此问题,您可能需要执行以下操作:
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
...
答案 1 :(得分:0)
这不是变量的存储,而是实例化类的表达式。如果使用两个整数,它将隐式使用整数除法。你应该使用分数或使用float()函数。
my_rational = Rational(3.0 / 2,9.0 / 2)
my_other_rational = Rational(float(3)/ 2,float(9)/ 2)
编辑:在Python 3.x中,情况不再如此。请参阅:http://www.python.org/dev/peps/pep-0238/