Python如何停止自动约分分数

3
我想知道在使用fractions模块时,是否有办法停止Python对分数进行自动约分。例如:
>>> import fractions
>>> fractions.Fraction(8,16)
Fraction(1, 2)

我希望保留分数格式为Fraction(8,16)。是否可以使用自定义类或类似方法实现?任何示例代码都将不胜感激!谢谢!Sumant

3
你为什么需要始终保持原分子和分母不变呢?你可以简单地将它们分开跟踪,但对于 fractions.Fraction() 的普通用例,这根本没有任何意义。 - Martijn Pieters
1
实际上是为数学活动创建一个学生工作表。对于想要学习加法分数的学生来说,这将更有意义,例如:1/2 + 1/6 = 8/12。当我在Python中执行此操作时,答案将是2/3而不是8/12。 - Sumant Murugesh
@SumantMurugesh:对于这么简单的事情,为什么不自己算一下呢,或者写一个ImproperFraction类? - Hugh Bothwell
2
请进一步描述您所需的数据类型。您需要对其执行哪些操作?为什么二元组不足以满足您的需求? - Chris Martin
1个回答

1

感谢 "bowlofred" 在python-forum.io上分享这个未记录的技巧:

from fractions import Fraction

def add_nonormal(a: Fraction, b: Fraction) -> Fraction:
    c_numerator = a.numerator*b.denominator + b.numerator*a.denominator
    c_denominator = a.denominator*b.denominator
    return Fraction(c_numerator, c_denominator, _normalize=False)

def sub_nonormal(a: Fraction, b: Fraction) -> Fraction:
    return add_nonormal(a, -b)

def mul_nonormal(a: Fraction, b: Fraction) -> Fraction:
    c_numerator = a.numerator*b.numerator
    c_denominator = a.denominator*b.denominator
    return Fraction(c_numerator, c_denominator, _normalize=False)

def reciprocal_nonormal(x: Fraction) -> Fraction:
    return Fraction(*reversed(x.as_integer_ratio()), _normalize=False)

def div_nonormal(a: Fraction, b: Fraction) -> Fraction:
    return mul_nonormal(a, reciprocal_nonormal(b))

assert add_nonormal(Fraction(1, 2), Fraction(1, 6)).as_integer_ratio() == (8, 12)

如果您正在广泛使用Fraction进行数学计算,并且所有不必要的中间gcd调用开始拖慢操作,那么这也非常有用。


我很好奇是否有任何快速的方法,至少可以因式分解出2的公共幂,以减少膨胀。 - JamesTheAwesomeDude

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接