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