在python中给出复杂答案的实数的分数

时间:2018-02-05 10:54:39

标签: python fractions

从分数导入分数以给出实数的分数表示,但是给出的响应非常复杂,而纸笔方法看起来非常简单。 Fractions(.2) giving answer 3602879701896397/18014398509481984
这是0.20000000000000001110223024625157,差不多.2,但我希望它只是1/5。
我知道这个用途有限制(),但我需要的是最小的分子和分母,它给出了确切的实数bcoz我在大范围内处理了很多数字所以我不能使用相同的limit()参数

2 个答案:

答案 0 :(得分:1)

您的奇怪输出来自float point problems。在某些情况下,您可以通过使用Fraction.limit_denominator()限制分母来克服这个问题。如果分母的实际值大于您使用的阈值,此过程当然也会导致舍入错误。此阈值的默认值为1,000,000,但您也可以使用较小的值。

import fractions

print(fractions.Fraction(0.1))
>>>3602879701896397/36028797018963968

#lower the threshold to 1000
print(fractions.Fraction(0.1).limit_denominator(1000))
>>>1/10

#won't work for smaller fractions, use default of 1,000,000 instead
print(fractions.Fraction(0.00001).limit_denominator(1000))
>>>0
print(fractions.Fraction(0.00001).limit_denominator())
>>>1/100000

当然,正如第一句中所解释的那样,由于浮点数的存储方式存在精度限制。如果您的数字大小为10 ^ 9,那么您将无法在小数部分获得10位数的准确表示

a = 1234567890.0987654321
print(a)

演示。但是你可能会问自己,如果你真的需要10 ^ -15的准确度,如果你的输入没有反映这种准确性。如果您想要更高的精度,则必须从一开始就使用decimal模块,并在所有数学运算中提高精度水平。更好的是从一开始就把分子和分母作为整数值来处理 - 在Python integer values are theoretically not restricted in size

答案 1 :(得分:0)

您可以使用Fraction类来表示0.2,您可以按如下方式访问分子和分母:

>>> from fractions import Fraction
>>> f = Fraction(1, 5)
>>> f.numerator
1
>>> f.denominator
5

希望它有所帮助。