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()方法有关,但我不太确定。

谢谢!

4

2 回答 2

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)]

(还有其他方法可以完成您的任务,但这与您最初的方法最相似。)

于 2013-05-04T18:47:09.923 回答
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)
于 2013-05-04T19:34:33.277 回答