mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
Issue #25928: Add Decimal.as_integer_ratio(). Python parts and docs by
Mark Dickinson.
This commit is contained in:
parent
ac1e7f6983
commit
53f2e0ad45
7 changed files with 213 additions and 3 deletions
|
@ -1010,6 +1010,58 @@ class Decimal(object):
|
|||
"""
|
||||
return DecimalTuple(self._sign, tuple(map(int, self._int)), self._exp)
|
||||
|
||||
def as_integer_ratio(self):
|
||||
"""Express a finite Decimal instance in the form n / d.
|
||||
|
||||
Returns a pair (n, d) of integers. When called on an infinity
|
||||
or NaN, raises OverflowError or ValueError respectively.
|
||||
|
||||
>>> Decimal('3.14').as_integer_ratio()
|
||||
(157, 50)
|
||||
>>> Decimal('-123e5').as_integer_ratio()
|
||||
(-12300000, 1)
|
||||
>>> Decimal('0.00').as_integer_ratio()
|
||||
(0, 1)
|
||||
|
||||
"""
|
||||
if self._is_special:
|
||||
if self.is_nan():
|
||||
raise ValueError("Cannot pass NaN "
|
||||
"to decimal.as_integer_ratio.")
|
||||
else:
|
||||
raise OverflowError("Cannot pass infinity "
|
||||
"to decimal.as_integer_ratio.")
|
||||
|
||||
if not self:
|
||||
return 0, 1
|
||||
|
||||
# Find n, d in lowest terms such that abs(self) == n / d;
|
||||
# we'll deal with the sign later.
|
||||
n = int(self._int)
|
||||
if self._exp >= 0:
|
||||
# self is an integer.
|
||||
n, d = n * 10**self._exp, 1
|
||||
else:
|
||||
# Find d2, d5 such that abs(self) = n / (2**d2 * 5**d5).
|
||||
d5 = -self._exp
|
||||
while d5 > 0 and n % 5 == 0:
|
||||
n //= 5
|
||||
d5 -= 1
|
||||
|
||||
# (n & -n).bit_length() - 1 counts trailing zeros in binary
|
||||
# representation of n (provided n is nonzero).
|
||||
d2 = -self._exp
|
||||
shift2 = min((n & -n).bit_length() - 1, d2)
|
||||
if shift2:
|
||||
n >>= shift2
|
||||
d2 -= shift2
|
||||
|
||||
d = 5**d5 << d2
|
||||
|
||||
if self._sign:
|
||||
n = -n
|
||||
return n, d
|
||||
|
||||
def __repr__(self):
|
||||
"""Represents the number as an instance of Decimal."""
|
||||
# Invariant: eval(repr(d)) == d
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue