天道酬勤,学无止境

python类分数(python class fraction numbers)

问题

我制作了一个代码,让用户以“d/n”的形式输入两个分数。

我怎样才能让它打印分数的简化形式?

例如:当我输入 2/4 时,它会打印 1/2?

   import sys

class Rational:

  def __init__(self,n,d):
    self.numerator= n
    self.denominator= d
  def value(self):
    return float(self.numerator)/float(self.denominator)

  def __repr__(self):
    return "%d/%d ~ %g" % (self.numerator,self.denominator,self.value())
  def read(self):
    while 1:
      try:
        s=raw_input("Enter fraction n/d: ")
        n,d= s.split("/")
        self.numerator= int(n)
        self.denominator= int(d)
      except KeyboardInterrupt:
        print
        exit()
      except:
        print sys.exc_info()[0]
        print "bad input, try again."
      else:
        if int(d)==0:
          print "The denominator cannot be zero. Try again."
        elif int(d)<0:
          print "The denominator cannot be negative. Try again."
        else:
          return

r1=Rational(1,1)
r1.read()
print r1

r2=Rational(1,1)
r2.read()
print r2
回答1

使用 fractions.Fraction() 类并让它为您完成工作:

>>> import fractions
>>> fractions.Fraction(2, 4)
Fraction(1, 2)

要自己简化分数,请计算最大公约数:

def gcd(a, b):
    while b:
        a, b = b, a%b
    return a

g = gcd(numerator, denominator)
numerator //= g
denominator //= g
回答2
    >>> num = 2
    >>> den = 4        
    >>> from fractions import Fraction
    >>> frac = Fraction(num,den).limit_denominator()
    >>> numer = frac.numerator
    >>> denom = frac.denominator
    >>> print '%d/%d ~ %g' % (numer, denom, float(numer)/denom)
    1/2 ~ 0.5

希望这可以帮助。 (链接 http://docs.python.org/2/library/fractions.html)

回答3

在显示数字之前,只需将numeratordenominator除以它们的最大公约数。 也就是说,如果您想使用自己的类。 否则, fractions模块中有一个Fraction类。

回答4

好吧,首先您将不得不向Rational类添加支持,该类计算分数的简化形式。 基本上,您需要做的是添加一个reduce()方法,该方法可以找到两个分子的最小公分母,即Rational 中的分母。 尝试查看算法的最小公倍数。

回答5
import fractions

f = fractions.Fraction(5, 10)
print (f) # print 1/2

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在 Python 中使用分数(Using Fractions in Python)
    问题 我在这里使用类来输入一个分数(当给定分子和分母时),以及将两个分数相加和相乘。 出于某种原因,导入的分数模块只能在部分程序中正常工作; gcd 方法有效,但 Fraction 方法(当给定两个数字时,放入分数格式)不起作用,而是抛出 NameError (具体来说,“全局名称 'Fractions' 未定义”)。 我究竟做错了什么? 我对 Python 比较陌生,如果有关于如何使此代码更紧凑但有更多异常的任何建议,我们将不胜感激。 这是我的代码: import fractions class FractionClass: # Initialize starting numerator and denominator. n = 0 d = 0 def __init__(self, numerator, denominator): self.n = numerator self.d = denominator # Function that adds fractions, whichs throws NameError if gcd() doesn't work! def add_fractions(self, other): try: sum_numerator = self.n + other.n sum_denominator = fractions.gcd(self.d
  • 如何将十进制数转换为分数?(How to convert a decimal number into fraction?)
    问题 我想知道如何在Python中将小数转换为最低形式的分数。 例如: 0.25 -> 1/4 0.5 -> 1/2 1.25 -> 5/4 3 -> 3/1 回答1 您有两种选择: 使用float.as_integer_ratio(): >>> (0.25).as_integer_ratio() (1, 4) (从Python 3.6开始,您可以对decimal.Decimal()对象执行相同的操作。) 使用fractions.Fraction()类型: >>> from fractions import Fraction >>> Fraction(0.25) Fraction(1, 4) 后者具有非常有用的str()转换: >>> str(Fraction(0.25)) '1/4' >>> print Fraction(0.25) 1/4 由于浮点值可能不精确,因此您可能会得到“奇怪”的分数; 使用Fraction.limit_denominator()限制分母以某种程度上“简化”分数: >>> Fraction(0.185) Fraction(3332663724254167, 18014398509481984) >>> Fraction(0.185).limit_denominator() Fraction(37, 200) 如果您仍在使用Python 2.6
  • 如何使用 Python编程来识别整数、浮点数、分数和复数
    让我们开始用 Python 探索数学与科学的世界。本章将从一些简单的问题开始,这样你就可以逐渐了解如何使用 Python。首先是基础的数学运算,随后编写简单的程序来操作和理解数字。 1 基本数学运算 本书中,Python 交互界面将成为我们的朋友。启动 Python 3 的 IDLE 界面,键入print(‘Hello IDLE’),然后按 Enter 键,在屏幕上输出 Hello IDLE(见图 1-1)。关于如何安装 Python 并启动 IDLE 的说明,请参阅附录 A。IDLE 会按照输入的命令执行,并将单词输出到屏幕上。恭喜你,你刚刚已经编写了一个程序! 当再次看到“>>>”提示时,IDLE 已准备好接收更多的指令。 Python 可以像一个神奇的计算器那样进行简单的计算。只要输入一个表达式, Python 就会对它进行计算。按 Enter 键后,结果会立刻显示。 1-1 Python 3 的 IDLE 界面 试试看。你可以使用加法(+)和减法(−)运算符来加减数字。例如: >>> 1 + 23>>> 1 + 3.54.5>>> -1 + 2.51.5>>> 100 – 4555>>> -1.1 + 53.9 使用乘法运算符(*)进行乘法运算: >>> 3 * 26>>> 3.5 * 1.55.25 使用除法运算符(/)进行除法运算: >>> 3 / 21.5>>> 4
  • 用Python解决数据结构与算法问题(一):Python基础
    python学习之路 - 从入门到精通到大师 文章目录 [python学习之路 - 从入门到精通到大师](https://blog.csdn.net/TeFuirnever/article/details/90017382)一、你好世界二、数据入门2.1、列表2.2、字符串2.3、元组2.4、集合2.5、字典 三、输入和输出四、控制结构五、处理异常六、定义函数七、面向对象编程:定义类7.1、一个分数类7.2、逻辑门和电路 八、总结推荐阅读参考文章 一、你好世界 来通过一些详细的例子回顾一下 Python 编程语言。 这里的目标是重新认识下 Python 语言,并强化一些将成为后面重点的概念。但是如果你是Python新手的话,或者你需要有关提出的任何主题的更多信息,建议参考 Python语言参考或 Python教程。 Python是一种现代的,易于学习的面向对象的编程语言。 它具有一组强大的内置数据类型和易于使用的控件结构。 由于是解释型语言,因此通过简单地查看和描述交互式会话,更容易进行检查。所以好多人会和你说推荐你使用 anaconda 的,比如:深度学习入门笔记(五):神经网络的编程基础。 在 jupyter notebook 中 >>> 是提示输入语句,然后计算你提供的Python语句。 例如: >>> print("Hello,World") Hello,World
  • 使用python将不适当的分数转换为带分数(Converting an improper fraction to a mixed number with python)
    问题 我需要我们 python 将不适当的分数转换为带分数,甚至将浮点数转换为带分数。 我的代码如下: from fractions import Fraction numerator = int(input("Enter numerator ") ) denominator = int(input("Enter denominator ") ) num = numerator / denominator num = Fraction(num) print(num) 如果输入是 5 和 4,则输出是“5/4”而不是混合数。 回答1 您可以使用除法和模运算符来打印: 整数部分是numerator // denominator 。 真分数余数的numerator % denominator是numerator % denominator 。 而且,当然,分母不会改变。 >>> num = 5 >>> den = 4 >>> print(' %d %d/%d' % (num // den, num % den, den)) 1 1/4 浮点数有点困难,因为您必须找出分母,而且通常不会精确。 有两种基本方法(和几种更高级的变体)可以做到这一点。 您可以循环到最大分母并选择误差最小的分母,或者您可以选择最大可接受的误差,然后循环直到找到一个分母低于它的结果。 做后者的示例代码如下: def
  • 对于给定的 fp 精度,检查 Python 中的数字是否为有理数(Check if a number is rational in Python, for a given fp accuracy)
    问题 我想知道在python中检查数字x是否是有理数(两个整数n,m存在,因此x = n / m)的好方法。 在 Mathematica 中,这是由函数Rationalize[6.75] : 27/4 我假设这个问题有一个给定精度的答案。 是否有获得这两个整数的通用算法? 回答1 在 python >= 2.6 中,浮点数有一个 as_integer_ratio 方法: >>> a = 6.75 >>> a.as_integer_ratio() (27, 4) >>> import math >>> math.pi.as_integer_ratio() (884279719003555, 281474976710656) 然而,由于浮点数在编程语言中的定义方式,没有无理数。 回答2 浮点数的性质意味着检查浮点数是否合理是没有意义的,因为所有浮点数实际上都是n / 2 e形式的分数。 但是,您可能很想知道是否有一个简单的分数(分母很小而不是 2 的大幂)非常接近给定的浮点数。 Donald Knuth 在The Art of Computer Programming第二卷中讨论了后一个问题。 参见习题 4.53-39 的答案。 这个想法是通过将范围的端点扩展为连分数,只要它们的系数相等,然后当它们不同时,在它们之间取最简单的值来搜索范围内分母最小的分数。 这是一个相当简单的
  • 如何在 Python 中将表示二进制分数的字符串转换为数字(How to convert a string representing a binary fraction to a number in Python)
    问题 让我们假设我们有一个表示二进制分数的字符串,例如: ".1" 作为十进制数,这是 0.5。 Python 中是否有一种标准方法可以将此类字符串转换为数字类型(无论是二进制还是十进制并不重要)。 对于整数,解决方案很简单: int("101", 2) >>>5 int() 需要一个可选的第二个参数来提供基数,但 float() 没有。 我正在寻找与此功能等效(我认为)的东西: def frac_bin_str_to_float(num): """Assuming num to be a string representing the fractional part of a binary number with no integer part, return num as a float.""" result = 0 ex = 2.0 for c in num: if c == '1': result += 1/ex ex *= 2 return result 我认为这符合我的要求,尽管我很可能错过了一些边缘情况。 是否有在 Python 中执行此操作的内置或标准方法? 回答1 以下是表达相同算法的较短方式: def parse_bin(s): return int(s[1:], 2) / 2.**(len(s) - 1) 它假定字符串以点开头。 如果你想要更一般的东西
  • 如何将浮点数转换为人类可读的分数?(How to convert floats to human-readable fractions?)
    问题 假设我们有0.33 ,我们需要输出1/3 。 如果我们有0.4 ,我们需要输出2/5 。 这样做的想法是使用户易于理解,以使用户理解y中的“ x个部分”,这是理解数据的一种更好的方法。 我知道百分比是一个很好的替代品,但是我想知道是否有一种简单的方法来做到这一点? 回答1 我发现David Eppstein对给定的实数C代码的有理逼近恰好是您所要的。 它基于连续分数理论,并且非常快速且相当紧凑。 我使用了针对特定分子和分母限制定制的版本。 /* ** find rational approximation to given real number ** David Eppstein / UC Irvine / 8 Aug 1993 ** ** With corrections from Arno Formella, May 2008 ** ** usage: a.out r d ** r is real number to approx ** d is the maximum denominator allowed ** ** based on the theory of continued fractions ** if x = a1 + 1/(a2 + 1/(a3 + 1/(a4 + ...))) ** then best approximation is found
  • Python 有减少分数的功能吗?(Does Python have a function to reduce fractions?)
    问题 例如,当我计算98/42我想得到7/3 ,而不是2.3333333 ,是否有使用 Python 或Numpy的函数? 回答1 fractions模块可以做到这一点 >>> from fractions import Fraction >>> Fraction(98, 42) Fraction(7, 3) 这里有一个 numpy gcd 的食谱。 然后你可以用它来划分你的分数 >>> def numpy_gcd(a, b): ... a, b = np.broadcast_arrays(a, b) ... a = a.copy() ... b = b.copy() ... pos = np.nonzero(b)[0] ... while len(pos) > 0: ... b2 = b[pos] ... a[pos], b[pos] = b2, a[pos] % b2 ... pos = pos[b[pos]!=0] ... return a ... >>> numpy_gcd(np.array([98]), np.array([42])) array([14]) >>> 98/14, 42/14 (7, 3) 回答2 除了约翰的回答: 从十进制数中得到简化分数(比如 2.0372856077554062) 使用 Fraction 给出以下输出: Fraction(2
  • 为什么statistics.mean()这么慢?(Why is statistics.mean() so slow?)
    问题 我将statistics模块的mean函数的性能与简单的sum(l)/len(l)方法进行了比较,发现mean函数由于某些原因非常慢。 我将timeit与下面的两个代码片段进行了比较,有人知道是什么原因导致执行速度上的巨大差异吗? 我正在使用Python 3.5。 from timeit import repeat print(min(repeat('mean(l)', '''from random import randint; from statistics import mean; \ l=[randint(0, 10000) for i in range(10000)]''', repeat=20, number=10))) 上面的代码在我的计算机上执行约0.043秒。 from timeit import repeat print(min(repeat('sum(l)/len(l)', '''from random import randint; from statistics import mean; \ l=[randint(0, 10000) for i in range(10000)]''', repeat=20, number=10))) 上面的代码在我的计算机上执行大约0.000565秒。 回答1 Python的statistics模块不是为速度而构建的
  • 用Java保持精度翻倍(Retain precision with double in Java)
    问题 public class doublePrecision { public static void main(String[] args) { double total = 0; total += 5.6; total += 5.8; System.out.println(total); } } 上面的代码打印: 11.399999999999 我如何才能仅打印(或将其用作)11.4? 回答1 正如其他人所提到的,如果您希望精确表示为11.4,则可能要使用BigDecimal类。 现在,对造成这种情况的原因进行一些解释: Java中的float和double基本类型是浮点数,其中的数字以小数和指数的二进制表示形式存储。 更具体地说,双精度浮点值(例如double类型)是64位值,其中: 1位表示符号(正或负)。 指数为11位。 52位为有效数字(小数部分为二进制)。 将这些部分组合以产生值的double表示。 (来源:维基百科:双精度) 有关Java中如何处理浮点值的详细说明,请参见《 Java语言规范》的第4.2.3节:浮点类型,格式和值。 byte , char , int , long类型是定点数,它们是数字的精确表示。 与定点数不同,浮点数有时(可以安全地假定为“大部分时间”)不能返回数字的精确表示形式。 这就是为什么最终以5.6 + 5.8的结果得到11
  • 如何确定小数是否可以完全表示为 Python 浮点数?(How to determine if a decimal fraction can be represented exactly as Python float?)
    问题 来自 Python 教程: 不幸的是,大多数十进制分数不能完全表示为二进制分数。 结果是,一般而言,您输入的十进制浮点数只能通过实际存储在机器中的二进制浮点数来近似。 我想知道如何检查给定的小数是否完全表示为 Python float 。 例如, 0.25可以精确表示而0.1不能: >>> 0.1 + 0.1 + 0.1 == 0.3 False >>> 0.25 + 0.25 + 0.25 == 0.75 True 回答1 在那个页面上: 在今天的大多数机器上,浮点数使用二进制分数近似,分子使用前 53 位从最高有效位开始,分母为 2 的幂。 因此,要使十进制分数精确地表示为float它必须是分母为 2 的幂的分数: >>> 1/10 + 1/10 + 1/10 == 3/10 # 0.1 + 0.1 + 0.1 False >>> 1/4 + 1/4 + 1/4 == 3/4 # 0.25 + 0.25 + 0.25 True 回答2 您可以使用分数模块来检查是否可以表示给定的分数: from fractions import Fraction def can_be_represented(num, den): f = Fraction(num, den) return Fraction.from_float(float(f)) == f 因为浮点数使用二进制小数
  • 在matplotlib python中使用带有tex分数表达式的格式(use format with tex fraction expression in matplotlib python)
    问题 我使用matplotlib。 我需要得到xlabel,例如:[1 / 8,2 / 8,3 / 8,4 / 8..14 / 8]。 我想使其循环。 因此,为了获得更好的视图,我在Python中使用了TEX。 为了在循环中呈现分数表达式,我使用了.format方法。 但是它不能正常工作。 在TEX中使用{}与.format方法之间存在一些冲突。 我尝试使用double {},但是它也不起作用。 import matplotlib.pyplot as plt fig = plt.figure() ax = fig.add_subplot(111) xax = ax.xaxis # get x axis labels = ['0'] for i in range(0, 14): labels.append(r'$\frac{}{8}$'.format(i)) # when trying to insert i an error occurs xax.set_ticklabels(labels) plt.show() 回答1 您需要使用另一个弯曲的括号来使弯曲的括号( { )脱离。 r'$\frac{{{}}}{{8}}$'.format(i) 这里, {{{}}}最里面的括号对用于格式化。 格式化期间,转义对{{用单个括号代替。 因此, r'$\frac{{{}}}{{8}}$'
  • Python浮空比率(Python float to ratio)
    问题 我尝试获取变量的定量并得到意外的结果。 有人可以解释一下吗? >>> value = 3.2 >>> ratios = value.as_integer_ratio() >>> ratios (3602879701896397, 1125899906842624) >>> ratios[0] / ratios[1] 3.2 我使用python 3.3 但我认为(16, 5)是更好的解决方案 以及为什么它可以校正为2.5 >>> value = 2.5 >>> value.as_integer_ratio() (5, 2) 回答1 使用分数模块可以简化分数: >>> from fractions import Fraction >>> Fraction(3.2) Fraction(3602879701896397, 1125899906842624) >>> Fraction(3.2).limit_denominator() Fraction(16, 5) 从Fraction.limit_denominator()函数中: 查找并返回最接近分母最多为max_denominator的self Fraction 。 该方法对于找到给定浮点数的有理逼近很有用 浮点数的精度受到限制,不能精确地表示许多数; 您看到的是四舍五入的表示形式,但实际数字是: >>> format(3.2, '
  • 如何获取小数点后的数字?(How to get numbers after decimal point?)
    问题 如何获得小数点后的数字? 例如,如果我有5.55 ,我怎么得到.55 ? 回答1 一个简单的方法为您: number_dec = str(number-int(number))[1:] 回答2 5.55 % 1 请记住,这不会帮助您解决浮点舍入问题。 即,您可能会得到: 0.550000000001 否则,您的预期值为0.55。 回答3 使用modf: >>> import math >>> frac, whole = math.modf(2.5) >>> frac 0.5 >>> whole 2.0 回答4 关于什么: a = 1.3927278749291 b = a - int(a) b >> 0.39272787492910011 或者,使用numpy: import numpy a = 1.3927278749291 b = a - numpy.fix(a) 回答5 使用标准库中的十进制模块,您可以保留原始精度并避免浮点舍入问题: >>> from decimal import Decimal >>> Decimal('4.20') % 1 Decimal('0.20') 如注释中的kindall注释所示,您必须首先将本机float转换为字符串。 回答6 试试Modulo: 5.55%1 = 0.54999999999999982 回答7 import math
  • 计算谐波级数的Python程序(Python program to calculate harmonic series)
    问题 有谁知道如何用 Python 编写一个程序来计算谐波级数的相加。 即 1 + 1/2 +1/3 +1/4... 回答1 @Kiv 的答案是正确的,但是如果您不需要无限精度,对于大 n 来说它会很慢。 在这种情况下最好使用渐近公式: #!/usr/bin/env python from math import log def H(n): """Returns an approximate value of n-th harmonic number. http://en.wikipedia.org/wiki/Harmonic_number """ # Euler-Mascheroni constant gamma = 0.57721566490153286060651209008240243104215933593992 return gamma + log(n) + 0.5/n - 1./(12*n**2) + 1./(120*n**4) @Kiv 对 Python 2.6 的回答: from fractions import Fraction harmonic_number = lambda n: sum(Fraction(1, d) for d in xrange(1, n+1)) 例子: >>> N = 100 >>> h_exact = harmonic_number
  • 浮点数学运算是否损坏?(Is floating point math broken?)
    问题 考虑以下代码: 0.1 + 0.2 == 0.3 -> false 0.1 + 0.2 -> 0.30000000000000004 为什么会出现这些错误? 回答1 二进制浮点数学就是这样。 在大多数编程语言中,它都是基于IEEE 754标准的。 问题的症结在于数字以这种格式表示为整数乘以2的幂。 分母不是2的幂的有理数(例如0.1 ,即1/10 )无法精确表示。 对于标准binary64格式的0.1 ,表示形式可以完全按照 以十进制表示的0.1000000000000000055511151231257827021181583404541015625 0x1.999999999999ap-4十六进制表示法中的0x1.999999999999ap-4 。 相反,有理数0.1 ,即1/10 ,可以精确地写为 十进制的0.1 ,或者 0x1.99999999999999...p-4 ,类似于C99十六进制表示法,其中...表示9的无休止序列。 程序中的常数0.2和0.3也将接近其真实值。 碰巧的是,最接近0.2 double 0.2数大于有理数0.2但最接近0.3 double 0.3却小于有理数0.3 。 0.1和0.2的总和大于有理数0.3 ,因此与代码中的常数不一致。 每个计算机科学家都应该对浮点算术了解什么是对浮点算术问题的相当全面的处理。 有关更容易理解的说明
  • 如何在Python中为自定义类重载`float()`?(How to overload `float()` for a custom class in Python?)
    问题 概括 我如何重载我的类的内置float ,以便当我在其实例上调用float()时,将调用我的自定义函数,而不是默认的内置函数? 我的课 嗨,我正在编写自己的Fractions类(用于任意高的浮点运算精度)。 它是这样的(我尚未完成): class Fractions: """My custom Fractions class giving arbitarilly high precision w/ floating-point arithmetic.""" def __init__(self, num = 0, denom = 1): """Fractions(num = 0, denom = 1) -> Fractions object Class implementing rational numbers. In the two-argument form of the constructor, Fraction(8, 6) will produce a rational number equivalent to 4/3. Both arguments must be rational, i.e, ints, floats etc. .The numerator defaults to 0 and the denominator defaults to 1 so that
  • 慕课网翁恺老师《面向对象程序设计——Java语言》第一周课程笔记及作业题(设计一个表示分数的Fraction类)
    一、类与对象 1.1 用类制造对象 对象变量是对象的管理者而非所有者,所以涉及到赋值、函数参数传递和比较都与普通变量有所不同。本节尝试自己定义类,然后用自己定义的类来创建对象;类定义了对象长什么样,对象则是按照类的定义所制造出来的实体,一个类可以创建很多对象。每个对象都有自己的数据。 下载 shapes.zip文件 对象是实体,需要被创建,可以为我们做事情;类是规范,根据类的定义来创建对象。对象=属性+服务,数据表示属性或形态,例如画圆时的圆心和半径,把数据和对数据的操作放在一起,称为封装。 1.2 定义类 类由两种东西构成:1.表示对象有什么成员变量;2.表示对象能做什么成员函数;一旦定义了类,我们就可以创建这个类的多个对象,这些对象就会做那个类所定义的动作(函数),但是各自具有不同的数据。 举例说明: package vendingmachine; public class VendingMachine { int price =80; int balance; int total; void showPrompt() { System.out.println("Welcome"); } void insertMorney(int amount) { balance = balance +amount; } void showBalance() { System.out
  • Fraction 对象没有 __int__ 但 int(Fraction(...)) 仍然有效(Fraction object doesn't have __int__ but int(Fraction(…)) still works)
    问题 在 Python 中,当您拥有一个对象时,您可以使用int函数将其转换为整数。 例如int(1.3)将返回1 。 这是通过使用对象的__int__魔术方法在内部工作的,在这种特殊情况下是float.__int__ 。 在 Python 中Fraction对象可用于构造精确的分数。 from fractions import Fraction x = Fraction(4, 3) Fraction对象缺少__int__方法,但您仍然可以对它们调用int()并获得合理的整数。 我想知道在没有定义__int__方法的情况下这怎么可能。 In [38]: x = Fraction(4, 3) In [39]: int(x) Out[39]: 1 回答1 使用__trunc__方法。 >>> class X(object): def __trunc__(self): return 2. >>> int(X()) 2 __float__不起作用 >>> class X(object): def __float__(self): return 2. >>> int(X()) Traceback (most recent call last): File "<pyshell#7>", line 1, in <module> int(X()) TypeError: int() argument