如何将令人难以置信的长小数转换为分数并以高精度转换回来



我正在尝试将非常大的整数转换为小数,然后将这些小数转换为分数,然后将分数转换回小数。我使用分数和小数包来尝试避免浮点不精度,但是精度仍然会很快下降。有什么办法来解决这个/其他方式做这件事?


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....

这是因为调用了limit_denominator()。此外,使用中间字符串进行转换效率非常低。

使用如下构造函数将Decimal对象转换为Fraction对象。(这是马克·狄金森的解决方案)

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)

相关内容