Python 如何找到一个最小的整数,当它与一系列浮点数相乘时,所有的值都是整数?

Python 如何找到一个最小的整数,当它与一系列浮点数相乘时,所有的值都是整数?,python,python-3.x,function,numpy,integer,Python,Python 3.x,Function,Numpy,Integer,我正在尝试编写一个函数,该函数返回需要乘以的最小整数的值,使浮点数列表成为所有整数。我尝试用“最小公倍数”实现一些东西,但我不确定数学是否正确 假设我有以下浮点值列表(或类似列表的对象): example = [0.5, 0.4, 0.2, 0.1] 如何编写返回func(示例)=10的函数 另一个例子是 example = [0.05, 0.1, 0.7, 0.8] > func(example) 20 因为 > 20 * np.array(example) np.array

我正在尝试编写一个函数,该函数返回需要乘以的最小整数的值,使浮点数列表成为所有整数。我尝试用“最小公倍数”实现一些东西,但我不确定数学是否正确

假设我有以下浮点值列表(或类似列表的对象):

example = [0.5, 0.4, 0.2, 0.1]
如何编写返回
func(示例)=10的函数

另一个例子是

example = [0.05, 0.1, 0.7, 0.8]

> func(example)
20
因为

> 20 * np.array(example)
np.array([1, 2, 14, 16]) 

所有的都是整数。

找到最大的小数位,将其乘以列表,找到gcd,然后找到最小的整数乘数

import numpy as np
import decimal
from math import gcd
from functools import reduce

def find_gcd(lst):
    x = reduce(gcd, lst)
    return x


example = [0.05, 0.1, 0.7, 0.8, 0.9]
decimal_places = min([decimal.Decimal(str(val)).as_tuple().exponent for val in example])
x1 = np.array(example)
multiplier = 1/(10**decimal_places)
gcd_val = find_gcd(map(int, x1 * multiplier))
min_multipler = int(multiplier/gcd_val)
print('Minimum Integer Multipler: ',  min_multipler)
如果你不喜欢十进制

example = [0.05, 0.1, 0.7, 0.8, 0.9]
n_places = max([len(str(val).split('.')[1]) for val in example])
multiplier = 10**n_places
x1 = np.array(example)
gcd_val = find_gcd(map(int, x1 * multiplier))
min_multipler = int(multiplier/gcd_val)
print('Minimum Integer Multipler: ',  min_multipler)

如果您对合理分母有一个上限
den\u max
fracts.fracts
类有一个方便的
limit\u分母方法

例如:

import fractions

max_den = 1000

fractions.Fraction(1/3)
# probably not what we want
# Fraction(6004799503160661, 18014398509481984)

fractions.Fraction(1/3).limit_denominator(max_den)
# better
# Fraction(1, 3)

import sympy

example = [0.5, 0.4, 0.2, 0.1]

sympy.lcm([fractions.Fraction(x).limit_denominator(max_den).denominator for x in example])
# 10

example = [0.05, 0.1, 0.7, 0.8]

sympy.lcm([fractions.Fraction(x).limit_denominator(max_den).denominator for x in example])
# 20

1/min([0.4,0.5])
不是整数。是的,这里的键是整数。对不起,
float
s从哪里来?如果您可以创建
Decimal
实例,则可以使用
as_integer\u ratio
方法获得最低公共项的分母,然后计算所有分母的LCM。您首先需要一种方法,将浮点数任意转换为有理数,这实际上是不可能的,所以实际上我们只需要知道哪些小骗子是被允许的。问题中没有足够的信息。另外,您是否假设值“精确”到某个位数,或者希望
[0.33333,0.5]
返回6而不是10的大幂?