diff -r fa745ed89b7a Lib/fractions.py --- a/Lib/fractions.py Thu Aug 23 15:53:45 2012 +0200 +++ b/Lib/fractions.py Fri Aug 24 16:19:15 2012 -0500 @@ -208,6 +208,16 @@ else: return cls(digits, 10 ** -exp) + def as_decimal(self, context=None): + """Returns a Decimal representation created using context, if + supplied. + """ + from decimal import getcontext, localcontext + if context is None: + context = getcontext() + with localcontext(context): + return Decimal(self.numerator) / Decimal(self.denominator) + def limit_denominator(self, max_denominator=1000000): """Closest Fraction to self with denominator at most max_denominator. diff -r fa745ed89b7a Lib/test/test_fractions.py --- a/Lib/test/test_fractions.py Thu Aug 23 15:53:45 2012 +0200 +++ b/Lib/test/test_fractions.py Fri Aug 24 16:19:15 2012 -0500 @@ -1,6 +1,6 @@ """Tests for Lib/fractions.py.""" -from decimal import Decimal +from decimal import Decimal, getcontext, localcontext from test.support import run_unittest, requires_IEEE_754 import math import numbers @@ -281,6 +281,24 @@ TypeError, "Cannot convert sNaN to Fraction.", F.from_decimal, Decimal("snan")) + def testAsDecimal(self): + self.assertRaisesMessage( + TypeError, "optional argument must be a context", + F(1,3).as_decimal, 42) + with localcontext() as ctx: + ctx.prec = 2 + self.assertEqual(F(1,3).as_decimal(ctx), Decimal('.33')) + self.assertEqual(F(F(1,3).as_decimal()).limit_denominator(), F(1,3)) + context = getcontext() + for i in range(-10, 10): + if i == 0: + continue + self.assertAlmostEqual( + F(F(1, i).as_decimal()), + F(1, i), + places=context.prec) + self.assertEqual(F(4,16).as_decimal(), Decimal('.250')) + def testLimitDenominator(self): rpi = F('3.1415926535897932') self.assertEqual(rpi.limit_denominator(10000), F(355, 113))