python 如何高精度地将超长小数转换为分数

ulydmbyx  于 2023-01-08  发布在  Python
关注(0)|答案(1)|浏览(174)

我试着把非常大的整数转换成小数,然后把这些小数转换成分数,再把分数转换回小数。我使用分数和小数包来避免浮点不精确,但是精度仍然很快下降。有什么方法可以解决这个问题/其他方法吗?

import fractions
import decimal

def convert(exampleInt):
    power_of_10 = len(str(exampleInt))
    decimal.getcontext().prec = 10000
    exampleDecimal = decimal.Decimal(exampleInt) / (decimal.Decimal(10) ** power_of_10)
    exampleFraction = fractions.Fraction(str(exampleDecimal)).limit_denominator()
    backToDecimal = exampleFraction.numerator / decimal.Decimal(exampleFraction.denominator)
    print(f"backToDecimal: {backToDecimal}")

convert(34163457536856478543908582348965743529867234957893246783427568734742390675934285342)

其输出:.341634575369123189552597490138153768602695082851231192155069838....

nkhmeac6

nkhmeac61#

这是因为调用了limit_denominator(),而且使用中间字符串转换效率很低。
使用如下构造函数将Decimal对象转换为Fraction对象(这是Mark Dickinson的解决方案)。

import fractions
import decimal

decimal.getcontext().prec = 100

d = decimal.Decimal(34163457536856478543908582348965743529867234957893246783427568734742390675934285342)
d = d / 10**(d.adjusted() + 1)

f = fractions.Fraction(d) # This is equivalent to Fraction(*d.as_integer_ratio())
d2 = decimal.Decimal(f.numerator) / f.denominator
assert(d2 == d)

相关问题