这是我的问题:
我正在编写一个程序来解决使用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
答案 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)