2013-08-02 21 views
1

作爲一個項目,我從頭開始創建一個Rational Class,它可以將兩個分數作爲輸入並存儲簡化分數。但是,當我嘗試輸入兩個分數時,它似乎隱式使用整數除法,所以我根本無法存儲/操作分數。我是否錯誤地處理了這個問題?錯誤在哪裏?作爲合理的Python存儲分數

示例: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),因爲它應該。編輯:下半場:我希望能夠輸入Rational(Rational(5/3),Rational(8/3))和(5,8)的結果。這似乎與上述略有不同。

+0

雖然我認爲這是一個很好的練習來實現您自己的運算符,但您可以查看SymPy(http://docs.sympy.org)以獲取全功能符號計算庫。 – lmjohns3

+0

檢查出來,非常有幫助 – AppliedNumbers

回答

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 
    ... 
0

,但表達實例類。如果你使用兩個整數,它將隱式使用整數除法。您應該使用分數或使用float()函數。

my_rational =理性(3.0/2,9.0/2)

my_other_rational =理性(浮子(3)/ 2,浮子(9)/ 2)

編輯:在Python 3。 x不再是這種情況。請參閱:http://www.python.org/dev/peps/pep-0238/