如何在Python中将float转换为分数?

时间:2015-04-22 17:29:18

标签: python class

我正在尝试定义一个类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转换为分数? 非常感谢你。

3 个答案:

答案 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)