将小数转换为字符串,括号中包含重复的小数位

Byt*_*der 5 python math fractions number-formatting

我想在Python 3中编写一个函数,它将作为分子和分母给出的分数转换为它们的字符串表示形式,作为十进制数,但在括号中包含重复的小数位.

一个例子:

  • convert(1, 4) 应该输出 "0.25"
  • convert(1, 3)应输出"0.(3)"而不是"0.3333333333"
  • convert(7, 11)应输出"0.(63)"而不是"0.6363636364"
  • convert(29. 12)应输出"2.41(6)"而不是"2.4166666667"

我当前的代码在问题的最后,但如果有非重复重复的小数位,它将失败.这是一个包含调试输出(注释print调用)的示例运行:

----> 29 / 12
5
appended 4
2
appended 1
8
index 2 ['29', 2, 8] result ['2.', '4', '(', '1']
repeating 8
['2.', '4', '(', '1', ')']
Run Code Online (Sandbox Code Playgroud)

我在这做错了什么?


我的代码:

def convert(numerator, denominator):
    #print("---->", numerator, "/", denominator)
    result = [str(numerator//denominator) + "."]
    subresults = [str(numerator)]
    numerator %= denominator
    while numerator != 0:
        #print(numerator)
        numerator *= 10
        result_digit, numerator = divmod(numerator, denominator)
        if numerator not in subresults:
            subresults.append(numerator)
            result.append(str(result_digit))
            #print("appended", result_digit)
        else:
            result.insert(subresults.index(numerator), "(")
            #print("index", subresults.index(numerator), subresults, "result", result)
            result.append(")")
            #print("repeating", numerator)
            break
    #print(result)
    return "".join(result)
Run Code Online (Sandbox Code Playgroud)

Roo*_*Two 4

您的代码只需要一些小的更改(请参阅下面的评论):

def convert(numerator, denominator):
    #print("---->", numerator, "/", denominator)
    result = [str(numerator//denominator) + "."]
    subresults = [numerator % denominator]          ### changed ###
    numerator %= denominator
    while numerator != 0:
        #print(numerator)
        numerator *= 10
        result_digit, numerator = divmod(numerator, denominator)
        result.append(str(result_digit))             ### moved before if-statement

        if numerator not in subresults:
            subresults.append(numerator)
            #print("appended", result_digit)

        else:
            result.insert(subresults.index(numerator) + 1, "(")   ### added '+ 1'
            #print("index", subresults.index(numerator), subresults, "result", result)
            result.append(")")
            #print("repeating", numerator)
            break
    #print(result)
    return "".join(result)
Run Code Online (Sandbox Code Playgroud)