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

时间:2018-06-17 03:47:02

标签: python python-2.7 math fractions

这是我的问题:

我正在编写一个程序来解决使用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

1 个答案:

答案 0 :(得分:2)

如果你知道你的分母有多大,你可以使用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得到不同的结果,这是因为正如OlivierMelançon指出的那样,我们的输入中有15位数字,使用max_denominator时,错误为1/(2 * max_denominator)