用 Python 精确分数

社会演员多 python 199

原文标题Accurate Fractions with Python

我没有从以下代码中看到我期望的数学结果,我认为它应该产生谐波级数:

from fractions import Fraction

def sum_fracs(n):
    if n == 1:
        return 1
    return 1/n + sum_fracs(n - 1)

for n in range(1, 6):
    print(sum_fracs(n).as_integer_ratio())
    
for n in range(1, 6):
    print(Fraction(sum_fracs(n)))

输出:

(1, 1)
(3, 2)
(8256599316845909, 4503599627370496)
(2345624805922133, 1125899906842624)
(1285402393645329, 562949953421312)
1
3/2
8256599316845909/4503599627370496
2345624805922133/1125899906842624
1285402393645329/562949953421312

两种方法都没有给出

1   

3/2

11/6    

25/12   

137/60

正如我所希望的。我知道浮点数可能有舍入错误,但我希望这种基本的东西在 Python 中是可能的。

非常感谢任何帮助。

原文链接:https://stackoverflow.com//questions/71509775/accurate-fractions-with-python

回复

我来回复
  • mozway的头像
    mozway 评论

    你跑Fraction(x)wherex是一个float。太晚了,你已经失去了精度,所以你的分数的精度和浮点数一样好。

    在函数中使用Fraction

    def sum_fracs(n):
        if n == 1:
            return 1
        return Fraction(1, n) + sum_fracs(n - 1)
    
    for n in range(1, 6):
        print(sum_fracs(n).as_integer_ratio())
    

    输出:

    (1, 1)
    (3, 2)
    (11, 6)
    (25, 12)
    (137, 60)
    

    注意。这在fraction文档中有明确说明

    请注意,由于二进制浮点的常见问题(请参阅浮点算术:问题和限制),Fraction(1.1) 的参数不完全等于 11/10,因此 Fraction(1.1) 不返回 Fraction(11) , 10) 正如人们所期望的那样。(但请参阅下面limit_denominator()方法的文档。)

    2年前 0条评论