在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,谢谢;