使用 Python 将无理小数化简为其等价的简单分数

Simplify an irrational decimal to its simple fraction equivalent using Python

这是我的问题:

我正在编写一个程序来使用 Python 2.7 解决定时编码挑战中的统计问题 我不允许使用许多外部包(但我可以使用 Fractions)。为了完成我的问题,我需要将一个无理小数转换成它的分数等值。

示例输入:

0.6428571428571428 [i.e. 9/14]

问题:

我想在这种情况下输出 9/14 但如果我做类似的事情:

print(Fraction(0.6428571428571428))

它会打印一些无法减少的超长分数。

有没有一种方法可以将 0.6428571428571428 减少到 9/14 而无需强制 最接近 14 的分数(因为我需要使用它有很多不同的分数)?

另一个例子:

.33333333333 (i.e. 1/3)

当前输出:

print(Fraction(.333333333333333)) # Outputs 6004799503160061/18014398509481984

如果您知道分母有多大,可以使用 limit_denominator。请参阅文档 for this

这是将 100000 设置为分母的结果

from fractions import Fraction
print(Fraction(.333333333333333).limit_denominator(max_denominator=100000))
# 1/3

print(Fraction(0.6428571428571428).limit_denominator(max_denominator=100000))
# 9/14

我们以 100000 作为上限给予了很大的自由度,但它仍然能找到我们要找的结果。您可以根据需要调整该数字。

对于这些情况,我继续得到这些结果直到 10**14 并且我在 10**15 开始得到不同的结果,这是因为,正如 Olivier Melançon 指出的那样,我们有 15 位数字输入,当使用 max_denominator 时,错误是 1/(2 * max_denominator)