Fractions.from_float() no longer loses precision with large integer inputs.

This commit is contained in:
Raymond Hettinger 2009-01-03 09:24:18 +00:00
parent c921dacf78
commit 40188782dd
3 changed files with 6 additions and 1 deletions

View File

@ -111,7 +111,7 @@ class Fraction(Rational):
""" """
if isinstance(f, numbers.Integral): if isinstance(f, numbers.Integral):
f = float(f) return cls(f)
elif not isinstance(f, float): elif not isinstance(f, float):
raise TypeError("%s.from_float() only takes floats, not %r (%s)" % raise TypeError("%s.from_float() only takes floats, not %r (%s)" %
(cls.__name__, f, type(f).__name__)) (cls.__name__, f, type(f).__name__))

View File

@ -139,6 +139,8 @@ class FractionTest(unittest.TestCase):
def testFromFloat(self): def testFromFloat(self):
self.assertRaises(TypeError, F.from_float, 3+4j) self.assertRaises(TypeError, F.from_float, 3+4j)
self.assertEquals((10, 1), _components(F.from_float(10))) self.assertEquals((10, 1), _components(F.from_float(10)))
bigint = 1234567890123456789
self.assertEquals((bigint, 1), _components(F.from_float(bigint)))
self.assertEquals((0, 1), _components(F.from_float(-0.0))) self.assertEquals((0, 1), _components(F.from_float(-0.0)))
self.assertEquals((10, 1), _components(F.from_float(10.0))) self.assertEquals((10, 1), _components(F.from_float(10.0)))
self.assertEquals((-5, 2), _components(F.from_float(-2.5))) self.assertEquals((-5, 2), _components(F.from_float(-2.5)))

View File

@ -56,6 +56,9 @@ Core and Builtins
Library Library
------- -------
- Fractions.from_float() no longer loses precision for integers to big to
cast as floats.
- Issue 4790: The nsmallest() and nlargest() functions in the heapq module - Issue 4790: The nsmallest() and nlargest() functions in the heapq module
did unnecessary work in the common case where no key function was specified. did unnecessary work in the common case where no key function was specified.