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