在python类中添加分数

在python类中添加分数,python,class,fractions,Python,Class,Fractions,我有一个类的这一部分,它取一个整数和一个分数,然后把它们加在一起 def __add__(self, g): whole_add=self.whole_number + g.whole_number numerator = (self.fraction.numerator * g.fraction.denominator ) + (g.fraction.numerator * self.fraction.denominator) denominator

我有一个类的这一部分,它取一个整数和一个分数,然后把它们加在一起

def __add__(self, g):
       whole_add=self.whole_number + g.whole_number
       numerator = (self.fraction.numerator * g.fraction.denominator ) + (g.fraction.numerator * self.fraction.denominator)
       denominator = self.fraction.denominator * g.fraction.denominator
       f=Fraction(numerator,denominator)
       return '{} and {}'.format(whole_add,f)

fraction_1 = Fraction(3, 4)
fraction_2 = Fraction(2, 3)
mixed_num_1 = MixedNumber(2, fraction_1)
mixed_num_2 = MixedNumber(1, fraction_2)
print(mixed_num_1 + mixed_num_2)
结果是3和17/12,当它应该是4和5/12时,我不确定如何做,我假设分数大于等于1。任何帮助都将不胜感激

如果您使用,您可以将所有内容相加,然后取分数的整数部分:

def __add__(self, g):
    summed = sum((self.whole_number, g.whole_number, self.fraction, g.fraction))
    whole = int(summed)
    remainder = summed - whole
    return '{} and {}'.format(whole, remainder)
分数类实现了uuu添加uuuu。对于您,您只需将整数和分数对象相加,就可以正常工作

使用常量演示:

>>> from fractions import Fraction
>>> summed = sum((2, 1, Fraction(3, 4), Fraction(2, 3)))
>>> whole = int(summed)
>>> remainder = summed - whole
>>> '{} and {}'.format(whole, remainder)
'4 and 5/12'
一个鲜为人知但很方便的factoid是,Python int类型同时具有.numerator和.demonator属性,这两个属性都是fracts.Fraction类使用的。如果您不使用分数库,您可以自己使用它:

def __add__(self, g):
    summed = 0
    for v in (self.whole_number, g.whole_number, self.fraction, g.fraction):
        summed = Fraction(summed.numerator * v.denominator +
                          v.numerator * summed.denominator,
                          summed.denominator * v.denominator)
    whole = summed._numerator // summed._denominator
    remainder = Fraction(summed.numerator * whole.denominator -
                         whole.numerator * summed.denominator,
                         summed.denominator * whole.denominator)
    return '{} and {}'.format(whole, remainder)
如果您使用的是,您可以对所有内容求和,然后取分数的整数部分:

def __add__(self, g):
    summed = sum((self.whole_number, g.whole_number, self.fraction, g.fraction))
    whole = int(summed)
    remainder = summed - whole
    return '{} and {}'.format(whole, remainder)
分数类实现了uuu添加uuuu。对于您,您只需将整数和分数对象相加,就可以正常工作

使用常量演示:

>>> from fractions import Fraction
>>> summed = sum((2, 1, Fraction(3, 4), Fraction(2, 3)))
>>> whole = int(summed)
>>> remainder = summed - whole
>>> '{} and {}'.format(whole, remainder)
'4 and 5/12'
一个鲜为人知但很方便的factoid是,Python int类型同时具有.numerator和.demonator属性,这两个属性都是fracts.Fraction类使用的。如果您不使用分数库,您可以自己使用它:

def __add__(self, g):
    summed = 0
    for v in (self.whole_number, g.whole_number, self.fraction, g.fraction):
        summed = Fraction(summed.numerator * v.denominator +
                          v.numerator * summed.denominator,
                          summed.denominator * v.denominator)
    whole = summed._numerator // summed._denominator
    remainder = Fraction(summed.numerator * whole.denominator -
                         whole.numerator * summed.denominator,
                         summed.denominator * whole.denominator)
    return '{} and {}'.format(whole, remainder)

修复版本的一种方法是直接处理不正确的分数:

   whole_add=self.whole_number + g.whole_number
   numerator = (self.fraction.numerator * g.fraction.denominator ) + (g.fraction.numerator * self.fraction.denominator)
   denominator = self.fraction.denominator * g.fraction.denominator
   whole_add += numerator // denominator
   numerator -= numerator % denominator
   f=Fraction(numerator,denominator)
   return '{} and {}'.format(whole_add,f)

尽管有更有效的方法更直接地进行此添加。

修复版本的一种方法是直接处理不正确的分数:

   whole_add=self.whole_number + g.whole_number
   numerator = (self.fraction.numerator * g.fraction.denominator ) + (g.fraction.numerator * self.fraction.denominator)
   denominator = self.fraction.denominator * g.fraction.denominator
   whole_add += numerator // denominator
   numerator -= numerator % denominator
   f=Fraction(numerator,denominator)
   return '{} and {}'.format(whole_add,f)

尽管有更有效的方法可以更直接地进行此添加。

首先,我假设您将此作为一个学习练习。如果没有,您几乎肯定会想使用stdlib附带的库,除非您(例如)需要更快的程序,在这种情况下,您可能想包装一些优化的C/Fortran/assembly库。每次计算后检查。当分子大于分母时,将分子和整数+1调整为@alexis。但也要记住注意负混合数!另外,您可能希望从uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu。如果没有,您几乎肯定会想使用stdlib附带的库,除非您(例如)需要更快的程序,在这种情况下,您可能想包装一些优化的C/Fortran/assembly库。每次计算后检查。当分子大于分母时,将分子和整数+1调整为@alexis。但也要记住注意负混合数!此外,您可能希望从uuu add_uuuu返回一个MixedNumber,而不是字符串。您知道为什么IntType具有这两个属性吗?@Satoru.Logic:See;数字已经统一,并且都具有.momerator和.demonator属性。对于int值,它们分别只是数字本身和1。@Martijin Pieters,谢谢;你知道为什么IntType有这两个属性吗?@Satoru.Logic:See;数字已经统一,并且都具有.momerator和.demonator属性。对于int值,它们分别只是数字本身和1。@Martijin Pieters,谢谢;