Python中如何返回未约分的分数,避免Fraction类自动化简?
Python 标准库的 fractions.Fraction 核心设计逻辑就是自动将分数约分为最简形式,没有内置开关可以关闭约分行为。要实现保留原始分子分母的未化简分数需求,可以用以下两种方案:
方案1:自定义未约分分数类
完全自己实现基础的分数结构,原生不做自动约分,可按需扩展和原生Fraction兼容的功能:
from fractions import Fraction class UnreducedFraction: def __init__(self, numerator, denominator): self.numerator = numerator self.denominator = denominator # 可选属性:如果后续需要约分结果,提前预存原生Fraction对象 self.reduced_frac = Fraction(numerator, denominator) def __str__(self): return f"{self.numerator}/{self.denominator}" def __repr__(self): return f"UnreducedFraction({self.numerator}, {self.denominator})" # 调用示例 def frac(n, d): return UnreducedFraction(n, d) print(frac(2,4)) # 输出 2/4
方案2:基于原生Fraction做包装
如果需要用到原生Fraction的所有运算能力,只需要额外保留原始分子分母,直接把原始值和Fraction对象绑定返回即可:
from fractions import Fraction def frac(n, d): # 返回结构:(原始分子, 原始分母, 已约分的Fraction对象) return (n, d, Fraction(n, d)) # 使用示例 res = frac(2,4) print(f"{res[0]}/{res[1]}") # 输出未化简的 2/4 # 需要做分数运算时直接使用res[2]即可
额外注意:你原有代码里写的
Fraction(n/d)是错误用法,n/d会先被计算为浮点数,很容易出现精度丢失,正确的原生 Fraction 初始化应该直接传两个参数:Fraction(n, d)。
内容的提问来源于stack exchange,提问作者Satan
相关产品推荐
相关产品推荐

