You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

已弃用的fractions.gcd()函数有何替代方案?需计算Fraction实例的最大公约数

替代弃用的fractions.gcd()计算Fraction实例的最大公约数

嘿,我之前也碰到过这个fractions.gcd()弃用的问题,官方说用math.gcd()但它只支持整数,不过我们可以基于Fraction的分子分母来实现有理数的GCD计算,这里有两种好用的方法:

方法1:基于数学定义手动计算

根据有理数GCD的数学定义,两个分数a/b和c/d的最大公约数等于分子的最大公约数除以分母的最小公倍数。我们可以用math.gcd()处理分子,用math.lcm()(Python 3.9+支持)处理分母,再组合成新的Fraction:

from fractions import Fraction
import math

def gcd_fractions(x: Fraction, y: Fraction) -> Fraction:
    numerator_gcd = math.gcd(x.numerator, y.numerator)
    denominator_lcm = math.lcm(x.denominator, y.denominator)
    return Fraction(numerator_gcd, denominator_lcm)

# 测试你提到的示例(推测你输入的是Fraction(1,3)和Fraction(1,2))
print(gcd_fractions(Fraction(1,3), Fraction(1,2)))  # 输出 Fraction(1, 6)

如果你的Python版本低于3.9(没有math.lcm()),可以自己实现最小公倍数计算:

def lcm(a: int, b: int) -> int:
    return a * b // math.gcd(a, b)

然后把denominator_lcm = lcm(x.denominator, y.denominator)替换进去即可。

方法2:通分后转整数计算

另一种思路是把两个分数通分转换成整数,计算整数的GCD后再转回分数:

from fractions import Fraction
import math

def gcd_fractions(x: Fraction, y: Fraction) -> Fraction:
    # 计算通分后的公共分母
    common_denominator = math.lcm(x.denominator, y.denominator)
    # 将分数转换为同分母的整数
    num1 = x.numerator * (common_denominator // x.denominator)
    num2 = y.numerator * (common_denominator // y.denominator)
    # 计算整数GCD后转回分数
    return Fraction(math.gcd(num1, num2), common_denominator)

这个方法和方法1的数学逻辑一致,只是实现路径不同,结果完全相同,也不会触发弃用警告。

验证原函数行为

你之前用fractions.gcd()得到的Fraction(1,6),应该是输入Fraction(1,3)和Fraction(1,2)的结果,用上面的方法测试会得到完全一致的输出,完美替代原弃用函数的功能。

内容的提问来源于stack exchange,提问作者Jean-Baptiste

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:07:10