python - 将分数存储为 Rational Python

标签 python class python-3.x fractions rational-numbers

作为一个项目,我正在从头开始创建一个 Rational 类,它可以将两个分数作为输入并存储简化分数。但是,当我尝试输入两个分数时,它似乎隐式使用整数除法,因此我根本无法存储/操作分数。我是否错误地处理了这个问题?哪里错了?

示例:Rational(3/2,9/2) 返回 (1,4) 而不是 (1/3)。

def gcd(numerator,denominator):
    if numerator < 0:
        absNum = -numerator
    elif denominator < 0:
        absDen = -denominator
    else:
        absNum = numerator
        absDen = denominator    

    while absNum != absDen:
        if absNum > absDen:
            absNum = absNum - absDen
        elif absDen >= absNum:
            absDen = absDen - absNum
    return(absNum)


class Rational:
    def __init__(self,numerator=0,denominator=1):
        self.numerator = numerator
        self.denominator = denominator
        if denominator == 0:
            raise ZeroDivisionError("Error: cannot store number with 0 in denominator.")
        elif denominator < 0:
            if numerator < 0:
                self.denominator = -denominator
                self.numerator = -numerator
            else:
                self.numerator = numerator
                self.denominator = -denominator 
        if numerator != 0:
            com = gcd(numerator,denominator)
            numerator = numerator/com
            denominator = denominator/com
            self.numerator = numerator
            self.denominator = denominator


Rational(5/3,8/3)

按应有的方式返回 (1,2),而不是 (5,8)。 编辑:后半部分:我希望能够输入 Rational(Rational(5/3),Rational(8/3)) 和 (5,8) 结果。这似乎与上面略有不同。

最佳答案

from __future__ import division

将解决除法问题。

旁注 - 如果您希望精确存储有理数,则应确保分子和分母都存储为整数。如果我没看错的话,你的 gcd 函数将无法使用 float 。

要解决此问题,您可能需要执行以下操作:

def __init__(self, num, den):
    num1, den1 = float(num).as_integer_ratio()
    den2, num2 = float(den).as_integer_ratio()
    self.numerator = num1 * num2
    self.denominator = den1 * den2
    ...

关于python - 将分数存储为 Rational Python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18024403/

相关文章:

python - 从纬度/经度对的数据框中删除圆括号

python - 使用函数迭代处理列表

java - Gson 不将 JSONarray 元素转换为类对象

jquery - 验证所有表单输入是否具有类别

python - PyQt4 在线程中等待来自 GUI 的用户输入

python - ROS1 catkin_make 失败 : catkin_install_python() called without required DESTINATION argument

c++ - 从普通类派生的抽象类。那有效吗?

python - 从普通函数调用生成器函数

python - 如何从 Ubuntu 19.10 卸载 python 3.7?

python - 来自 subprocess.Popen.communicate() 与 stdin 的损坏管道