Skip to main content
 首页 » 编程设计

python之如何从 float 列表中获取 python 中整数的最大公约数

2025年05月04日14sxdcgaq8080

我有一个 float 列表

l1 = [10.0, 50.0, 100.0] 
l2 = [0.1, 0.5, 1.0] 
l3 = [20.0, 100.0, 200.0] 

所有应该返回:

i = [1, 5, 10] 

以较小的乘数为底数获取整数的最有效方法是什么?或它们的倍数,如果不可能的话

示例:

n1 = [0.2, 0.3, 0.6] 

应该返回

i = [2, 3, 6] 

和

 n2 = [1424.56, 2136.84, 4985.96] 

应该返回:

 i = [ 2, 3, 7] # 712.28 = 1 

我正在使用 value/min(l1) 但它不适用于第二种情况和第三种情况

请您参考如下方法:

您可以将所有数字转换为整数,然后将每个数字除以它们的 greatest common divisor (GCD) .最好避免使用 float ,因为它们无法准确表示许多小数。 fractions模块非常适合这个:它可以处理小数和有理数,例如 1/3 和 2/7。

#!/usr/bin/env python3 
 
from fractions import Fraction 
from functools import reduce 
from math import gcd 
 
def lcm(a, b): 
    return a * b // gcd(a, b) 
 
def common_integer(*numbers): 
    fractions = [Fraction(n).limit_denominator() for n in numbers] 
    multiple  = reduce(lcm, [f.denominator for f in fractions]) 
    ints      = [int(f * multiple) for f in fractions] 
    divisor   = reduce(gcd, ints) 
    return [int(n / divisor) for n in ints] 

这会将每个数字转换为有理数 fraction ,然后将它们乘以它们的分母的最小公倍数 (LCM)。这有效地扩大了他们,所以他们都是整数。然后将它们除以它们的集体 GCD,尽可能缩小它们。

例子:

>>> common_integer('0.2', '0.3', '0.6') 
[2, 3, 6] 
>>> common_integer('1424.56', '2136.84', '4985.96') 
[2, 3, 7] 
>>> common_integer('2/7', '18/42', '1/3') 
[6, 9, 7] 

(使用 limit_denominator() 允许传入 float ,即使是不精确的 float 。不完全推荐,但您可以省略引号并传递 0.2 代替'0.2' 或 1/3 代替 '1/3'。)