为什么我的功能并不总是返回正确的列表?

Rya*_*axe 0 python tuples function list

我有一个函数,它接受两个输入,并将返回一个元组数组,其中给定元组中的两个数字与给予函数的两个数字具有完全相同的比率!

所以一切都运行良好,但出于某种原因,在某些情况下,它并没有取得每个元组.这是一个例子,我不知道为什么:

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)]
Run Code Online (Sandbox Code Playgroud)

所以它只返回一个元组,但如果你将75和273除以3,你会得到一个25和91的元组,它们具有相同的比例!为什么我的函数没有拿起这个实例?

如果它有帮助,我怀疑它与该is_integer()方法有关,但我不太确定.

谢谢!

Bre*_*arn 5

这是由于浮点运算的不精确性:

>>> ((100/364)*364).is_integer()
False
>>> ((25/91)*91).is_integer()
False
Run Code Online (Sandbox Code Playgroud)

你应该通过交叉乘法来检查分数的等价性,而不是做你正在做的事情.也就是说,给定一个分数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)]
Run Code Online (Sandbox Code Playgroud)

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