Python 如何停止自动减少分数

问题描述 投票:0回答:1

我想知道是否有什么方法可以阻止Python在使用fractions模块时自动减少分数。例如:

>>> import fractions
>>> fractions.Fraction(8,16)
Fraction(1, 2)

我想将分数保留为 Fraction(8,16)。是否可以使用自定义类或类似类?任何示例代码将不胜感激!

谢谢! 苏曼特

python reduce fractions
1个回答
1
投票

h/t “bowlofred” at python-forum.io 对于这个未记录的黑客:

from fractions import Fraction

def add_nonormal(a: Fraction, b: Fraction) -> Fraction:
    if a.denominator == b.denominator:
        c_numerator = a.numerator + b.numerator
        c_denominator = a.denominator
    else:
        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, 6), Fraction(2, 6)).as_integer_ratio() == (3, 6)
assert add_nonormal(Fraction(1, 2), Fraction(1, 6)).as_integer_ratio() == (8, 12)

如果您“错误”使用

Fraction
进行广泛的数学计算,并且所有不必要的中间
gcd
调用开始使操作陷入困境,这也很有用。

© www.soinside.com 2019 - 2024. All rights reserved.