浮点数需要显示为分数

Floating point number needs to be displayed as a fraction

请您针对以下问题提出建议。

首先我们必须用分子除以分母以获得浮点数。 那么小数点后的数字需要显示为分数。

当 9 除以 4 时,它必须显示为 2 1/4.This 工作正常。

13除以5需要显示为2 3/5

我的代码不适用于第二种情况。 获取输出为

2 5404319552844595/9007199254740992.

第一步: 分子除以分母得到商 使用 (nmr%dnr).

计算余数

第 2 步: 再将上一步得到的余数除以分母。 使用 Fractions 内置方法将浮点数转换为分数。

第 3 步:
输出存储在元组中并打印输出。 t1=(int(q),r).

代码:

from fractions import Fraction

def printValue(num,den):
    rem=0.0;q=0.0;

    q=float(num)/float(den)
    rem=float(num)%float(den)

    if rem>0:
        #print ("%0.2f"%(rem/den))
        r=Fraction(round(rem/den,2))
        t1=(int(q),r)                    #Output is stored in a tuple
        return t1
    else:
        t2=(int(q),)
        return t2


num=int(input())
den=int(input())
z=printValue(num,den)
for i in z:
    print(i,end=" ")

您可以使用 divmod.

def printValue(num, den):
    x, r = divmod(num, den)
    print(f'{x if x else ""} {r}/{den}')

printValue(9, 4)
# prints:
2 1/4

printValue(13, 5)
# prints:
2 3/5

printValue(2, 5)
# prints:
 2/5

问题是 floating point is broken... 或者更确切地说,它的准确性有限。一个小数只有在其分母是 2 的幂时才能准确表示,这说明 9/4 给出了准确且预期的结果。

但是 Python 很棒。 Fraction class 有一个 limit_denominator() 方法,它通过搜索有限的分母(默认为 1000000 ).

演示:

>>> f = 3/5
>>> Fraction(f)
Fraction(5404319552844595, 9007199254740992)
>>> Fraction(f).limit_denominator()
Fraction(3, 5)