查找公因数以将浮点数列表转换为整数列表

ad1*_*1v7 4 python floating-point

我有一个来自其他函数的浮点数列表。我所知道的是,在理想世界中,存在一个公因数,可用于将每一项相乘以获得整数列表。可能存在一些小的数值噪声(~1e-14)。

例如

[2.3333333333333335, 4.666666666666667, 1.0, 1.6666666666666667]
Run Code Online (Sandbox Code Playgroud)

这里每一项都可以乘以 3 以获得

[7.0, 14.0, 3.0, 5.0]
Run Code Online (Sandbox Code Playgroud)

我怎样才能找到这个词?我们可以假设存在整数解。

任何有帮助的评论将不胜感激

Jos*_*Lee 6

Python的Fraction类型可以将浮点数转换为分母在1000000以下的有理数,然后可以找到最小公分母。

>>> from fractions import Fraction
>>> a = [2.3333333333333335, 4.666666666666667, 1.0, 1.6666666666666667]
>>> [Fraction(x).limit_denominator() for x in a]
[Fraction(7, 3), Fraction(14, 3), Fraction(1, 1), Fraction(5, 3)]
Run Code Online (Sandbox Code Playgroud)

使用math.gcd函数查找最小公倍数的简单方法:

>>> denoms = [3,3,1,2]
>>> functools.reduce(lambda a,b: a*b//math.gcd(a,b), denoms)
6
Run Code Online (Sandbox Code Playgroud)