我正在尝试定义一个类Fraction:
def __init__(self,num=0,denom=1):
self.num = num
self.denom = denom
我还想定义一个添加方法,
def __add__(self,right):
if type(right) is int:
return (self.num/self.denom) + right
if type(right) is Fraction:
return ((self.num/self.denom)+(right.num/right.denom))
def __radd__(self,left):
return (self.num/self.denom)+left
它可以工作,并且总是返回一个浮点数。但是,我希望它返回一个分数。 例如: 如果我测试:
f = Frac(1,2)
f + Frac(1,3)
f + 2
Frac(1,3) + f
2 + f
我总是得到:
*Error: f+Frac(1,3) -> 0.8333333333333333 but should -> 5/6
*Error: f+2 -> 2.5 but should -> 5/2
*Error: Frac(1,3)+f -> 0.8333333333333333 but should -> 5/6
*Error: 2+f -> 2.5 but should -> 5/2
是否有任何方法可以将结果从float转换为分数? 非常感谢你。
答案 0 :(得分:4)
首先不要创建浮动。例如,
def __add__(self,right):
if type(right) is int:
return Fraction(self.num + right*self.denom, self.denom)
elif if type(right) is Fraction:
# Reducing the answer to lowest terms is left
# as an exercise for the reader
return Fraction(self.num*right.denom + right.num*self.denom,
self.denom*right.denom)
答案 1 :(得分:0)
Emulating numeric types上的Python文档部分介绍了如何实现自己的数字类型。
标准库中的numbers
module还包含有理类型的抽象基类(如分数类型)。
当然,标准库中还有一个现有的实现,它完全按照您的意图执行:fractions.Fraction
。如果您有兴趣了解它的工作原理,可以read its source code in Lib/fractions.py
。
答案 2 :(得分:0)
Python的分数模块可以帮助你:
https://docs.python.org/2/library/fractions.html
示例:
from fractions import Fraction
Fraction('3.1415926535897932').limit_denominator(1000)
解决方案:分数(355,113)