2013-05-04 43 views
0

我有一個函數需要兩個輸入,並將返回一個元組數組,其中給定元組中的兩個數字與賦給該函數的兩個數字具有完全相同的比率!爲什麼我的函數不總是返回正確的列表?

所以一切工作正常,但由於某種原因,在某些情況下,它不拾取每個元組。下面是它的一個例子,我不知道爲什麼:

In [52]: def find_r(num1,num2): 
    ....:   ratio = num1/float(num2) 
    ....:   ratio = 1/ratio 
    ....:   my_list = [(a,int(a * ratio)) for a in range(1,num1) if float(a * ratio).is_integer()] #and a * 1/float(ratio) + a <= num1] 
    ....:   return my_list 
    ....: 

In [53]: find_r(100,364) 
Out[53]: [(75, 273)] 

所以它只是返回一個元組,但如果你把兩個75和273 3,你得到的25和91的元組,其中有相同的比例!爲什麼我的功能沒有拿起這個實例?

如果有幫助,我懷疑它與is_integer()方法有關,但我不太確定。

謝謝!

回答

5

這是由於浮點運算的不精確性:

>>> ((100/364)*364).is_integer() 
False 
>>> ((25/91)*91).is_integer() 
False 

而不是做你正在做什麼,你應該檢查通過交叉相乘分數等值。也就是說,給定分數a/b,要檢查它是否等於另一個c/d,請檢查是否爲ad == bc。這將避免分割並將所有內容保存爲整數。

你可以這樣做:

def find_r(num1,num2): 
    return [(a, a*num2//num1) for a in range(1, num1) if (a*num2) % num1 == 0] 

>>> find_r(100, 364) 
[(25, 91), (50, 182), (75, 273)] 

(還有其他的方法來完成你的任務,但是這是最相似的原始的做法。)

+0

這是有道理的,但不幸的是,我不能檢查分數的等價,因爲我在做基於具有完全相同的比例項的列表。我只需要清除我所做的非整數,但正如您所指出的那樣,某些整數看起來像浮點數,這是我的問題。 – 2013-05-04 18:50:09

+1

@RyanSaxe:比例是一個分數。看到我編輯的答案的方式來做到這一點。 – BrenBarn 2013-05-04 18:57:40

0

我認爲你得到的答案你預計

>>> r=100/float(364) 
>>> r 
0.27472527472527475 
>>> r=1/r 
>>> r 
3.6399999999999997 
>>> r*25 
90.99999999999999 
>>> r*75 
273.0 

爲了使您的整數檢查,你可以使用

if(int(a*ratio) == a*ratio)喜歡

def find_r(num1,num2): 
     ratio = num1/float(num2) 
     ratio = 1/ratio 
     my_list = [(a,int(a * ratio)) for a in range(1,num1) if int(a * ratio) == a * ratio] 
     for a in range(1,num1): 
      if int(a * ratio) == a * ratio: 
       print a * ratio 
     return my_list 


print find_r(100,364) 
相關問題