Python 的精确分数

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.

中是可能的

非常感谢任何帮助。

你 运行 Fraction(x) 其中 x 是一个浮点数。为时已晚,您已经失去了精度,因此您的分数精度与浮点数一样好。

在函数中使用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 文档

中明确说明了这一点

Note that due to the usual issues with binary floating-point (see Floating Point Arithmetic: Issues and Limitations), the argument to Fraction(1.1) is not exactly equal to 11/10, and so Fraction(1.1) does not return Fraction(11, 10) as one might expect. (But see the documentation for the limit_denominator() method below.)