【问题标题】:Converting an improper fraction to a mixed number with python使用python将假分数转换为带分数
【发布时间】:2015-11-12 03:15:48
【问题描述】:

我需要使用 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' 而不是混合数。

【问题讨论】:

  • 如果您只是问,因为您正在寻找一种方法来以更易于人类理解的方式表示精确的非整数(例如,没有浮点不准确),同时仍然精确地存储它们,您可以考虑使用Decimal() 来代替fractions.Fraction(),或者除了fractions.Fraction()。没错,你不会“看到”说 2 的平方根的确切精度,但我相信你将能够存储确切的值,并且你可以使用其他方法精确地四舍五入到你想要的任何数字, 用于显示。

标签: python fractions


【解决方案1】:

您可以使用除法和取模运算符来打印:

整数部分为numerator // denominator

真分数余数的分子是numerator % denominator

当然,分母不会改变。

>>> num = 5
>>> den = 4
>>> print(' %d %d/%d' % (num // den, num % den, den))
 1 1/4

浮点数有点困难,因为您必须找出分母,而且通常不会准确。有两种基本方法(和几个更高级的变体)可以做到这一点。您可以循环到最大分母并选择误差最小的那个,或者您可以选择最大可接受的误差,然后循环直到找到一个分母低于它的结果。后者的示例代码如下:

def approximate_frac(src, epsilon):
    d = 0.0
    while 1:
        d += 1.0
        n = int(src * d)
        info = [(abs(n / d - src), n) for n in (n, n+1)]
        info.sort()
        err, n = info[0]
        if err < epsilon:
            return n, int(d)

print(approximate_frac(1.0/3.0, 0.001))
print(approximate_frac(2.0/17.0, 0.001))

这会导致:

(1, 3)
(2, 17)

【讨论】:

  • 您可以使用Fraction 来获取float 的分母或浮点数的字符串表示形式。例如,f = Fraction('3.14159265359'); f.numerator; f.denominator
  • 另外,您可以使用Fraction.limit_denominator(max_denominator) 来查找分母最多为max_denominator 的最接近的分数。该方法似乎使用continued fractions,因此对于该邻域的分母来说,近似值是尽可能好的。例如,使用 35000 的max_denominator 转换时,3.141592653589793(pi 的近似值)为 104348 / 33215 = 3.1415926539214212,精确到 10 位。
【解决方案2】:
from fractions import Fraction
def convert_to_mixed_numeral(num):
    """Format a number as a mixed fraction.

    Examples:
        convert_to_mixed_numeral('-55/10') # '-5 1/2'
        convert_to_mixed_numeral(-55/10) # '-5 1/2'
        convert_to_mixed_numeral(-5.5) # '-5 1/2'

    Args:
        num (int|float|str): The number to format. It is coerced into a string.

    Returns:
        str: ``num`` formatted as a mixed fraction.

    """
    num = Fraction(str(num)) # use str(num) to prevent floating point inaccuracies
    n, d = (num.numerator, num.denominator)
    m, p = divmod(abs(n), d)
    if n < 0:
        m = -m
    return '{} {}/{}'.format(m, p, d) if m != 0 and p > 0 \
        else '{}'.format(m) if m != 0 \
        else '{}/{}'.format(n, d)

函数可以通过将分子和分母作为数字、字符串或分数实例传递给它来使用。或者可以修改为将分子和分母作为单独的变量。

【讨论】:

  • 我不清楚你的代码,因为它给了我错误。我按照您的意图重新编写了代码,但我不确定。这是你的意思吗? pastebin.com/guSw1mQk
【解决方案3】:

尝试手动实现:

  a = numerator // denominator 
  b = numerator % denominator
  print '{} {}/{}'.format(a, b, denominator)

目前您只是打印“x/b”,如果输入是浮点数,请先进行适当的翻译。

希望对你有帮助。

【讨论】:

  • 还有a, b = divmod(numerator, denominator) 可以在一个函数调用中同时获得两者。
  • 使用//将负数减一。
【解决方案4】:
def toMixed(num, den):
    whole = abs(num)//den
    remain = abs(num)%den
    if num<0:
      whole*=-1
      remain*=-1
    if remain == 0:
      return str(whole)
    elif whole==0:
      return str(remain)+"/"+str(den)
    else:
      return str(whole)+" "+str(remain)+"/"+str(den)

注意:如果分数是负数,那么分子是负数而不是分母(如果两者都是负数,那么它们都需要转换为正数)

您可以随意返回值

【讨论】:

    猜你喜欢
    • 2016-09-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多