Kaydet (Commit) 605ed024 authored tarafından Raymond Hettinger's avatar Raymond Hettinger

SF bug #1071588 coercing decimal to int doesn't work between -1 and 1

üst 8f2c4eed
...@@ -1410,14 +1410,14 @@ class Decimal(object): ...@@ -1410,14 +1410,14 @@ class Decimal(object):
return context._raise_error(InvalidContext) return context._raise_error(InvalidContext)
elif self._isinfinity(): elif self._isinfinity():
raise OverflowError, "Cannot convert infinity to long" raise OverflowError, "Cannot convert infinity to long"
if not self:
return 0
sign = '-'*self._sign
if self._exp >= 0: if self._exp >= 0:
s = sign + ''.join(map(str, self._int)) + '0'*self._exp s = ''.join(map(str, self._int)) + '0'*self._exp
return int(s) else:
s = sign + ''.join(map(str, self._int))[:self._exp] s = ''.join(map(str, self._int))[:self._exp]
return int(s) if s == '':
s = '0'
sign = '-'*self._sign
return int(sign + s)
def __long__(self): def __long__(self):
"""Converts to a long. """Converts to a long.
......
...@@ -967,13 +967,13 @@ class DecimalPythonAPItests(unittest.TestCase): ...@@ -967,13 +967,13 @@ class DecimalPythonAPItests(unittest.TestCase):
self.assertEqual(d, e) self.assertEqual(d, e)
def test_int(self): def test_int(self):
data = '1.0 1.1 1.9 2.0 0.0 -1.0 -1.1 -1.9 -2.0'.split() for x in range(-250, 250):
for s in data: s = '%0.2f' % (x / 100.0)
# should work the same as for floats # should work the same as for floats
self.assertEqual(int(Decimal(s)), int(float(s))) self.assertEqual(int(Decimal(s)), int(float(s)))
# should work the same as ROUND_DOWN # should work the same as to_integral in the ROUND_DOWN mode
d = Decimal(s) d = Decimal(s)
r = Context(prec=1, rounding=ROUND_DOWN).create_decimal(s) r = d.to_integral(ROUND_DOWN)
self.assertEqual(Decimal(int(d)), r) self.assertEqual(Decimal(int(d)), r)
class ContextAPItests(unittest.TestCase): class ContextAPItests(unittest.TestCase):
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment