自定义Fraction类遇问题:/、>、<运算符无法正常工作求助
解决你的Fraction类运算符问题
嘿,我瞅了下你的代码,问题很明确——你只实现了加法和字符串输出的魔法方法,但除法(/)、大于(>)、小于(<)对应的运算符魔法方法完全没定义,而且你的加法方法还没写完呢!来一步步给你修正:
首先先把你原代码里的问题点列出来:
__add__方法只算了新分子分母,但没有用gcd约分,也没有返回新的Fraction实例- 缺少处理
/运算符的__truediv__方法 - 缺少处理
>的__gt__和<的__lt__比较方法
下面是修正后的完整代码,每部分都加了注释:
def gcd(m, n): while m % n != 0: m, n = n, m % n return n class Fraction: '''Fractional class''' def __init__(self, num, denom): # 初始化时先约分,避免后续运算冗余,同时确保分母为正 common = gcd(num, denom) self.num = num // common self.denom = denom // common if self.denom < 0: self.num *= -1 self.denom *= -1 def __str__(self): return f"{self.num}/{self.denom}" def __add__(self, other): # 计算加法后的分子分母 new_num = self.num * other.denom + other.num * self.denom new_denom = self.denom * other.denom # 返回约分后的新Fraction实例 return Fraction(new_num, new_denom) def __truediv__(self, other): # 分数除法:乘以除数的倒数 new_num = self.num * other.denom new_denom = self.denom * other.num return Fraction(new_num, new_denom) def __gt__(self, other): # 交叉相乘比较,避免浮点精度问题 return self.num * other.denom > other.num * self.denom def __lt__(self, other): return self.num * other.denom < other.num * self.denom # 可选:补充等于运算符,让比较更完整 def __eq__(self, other): return self.num * other.denom == other.num * self.denom
代码解释:
- 初始化方法优化:创建分数时就先约分,并且把分母转为正数,避免后续运算出现负分母的混乱
__truediv__方法:处理/运算符,本质是把除法转为乘法(乘以另一个分数的倒数),然后返回约分后的新分数__gt__和__lt__方法:用交叉相乘的方式比较大小,这样不会因为转成浮点数丢失精度(比如1/3和3/9直接转浮点数可能有误差,但交叉相乘就完全准确)- 补全
__add__:最后返回了新的Fraction实例,并且利用初始化时的约分逻辑自动简化结果
测试示例:
f1 = Fraction(1, 2) f2 = Fraction(3, 4) # 测试加法 print(f1 + f2) # 输出 5/4 # 测试除法 print(f1 / f2) # 输出 2/3 # 测试比较 print(f1 > f2) # 输出 False print(f1 < f2) # 输出 True
这样你的运算符就都能正常工作啦!
内容的提问来源于stack exchange,提问作者JYP
相关产品推荐
相关产品推荐

