Get Precise Decimal String Representation Of Python Decimal?
Solution 1:
Short answer:
>>> d
Decimal('1E-14')
>>> '{:f}'.format(d)
'0.00000000000001'
Long answer:
As Brandon Rhodes pointed out PEP 3101 (which is the string format PEP) states:
The syntax for format specifiers is open-ended, since a class can override the standard format specifiers. In such cases, the str.format() method merely passes all of the characters between the first colon and the matching brace to the relevant underlying formatting method.
And thus, the Decimal.__format__
method is what python's string format will utilize to generate the str
representation of the Decimal
value. Basically Decimal
overrides the formatting to be "smart" but will default to whatever values the format string sets (ie {:.4f}
will truncate the decimal to 4 places).
Here's why you can trust it (snippet from decimal.py:Decimal.__format__
):
def__format__(self, specifier, context=None, _localeconv=None):
## ...implementation snipped.## figure out placement of the decimal point
leftdigits = self._exp + len(self._int)
if spec['type'] in'eE':
ifnot self and precision isnotNone:
dotplace = 1 - precision
else:
dotplace = 1elif spec['type'] in'fF%':
dotplace = leftdigits
elif spec['type'] in'gG':
if self._exp <= 0and leftdigits > -6:
dotplace = leftdigits
else:
dotplace = 1# find digits before and after decimal point, and get exponentif dotplace < 0:
intpart = '0'
fracpart = '0'*(-dotplace) + self._intelif dotplace > len(self._int):
intpart = self._int + '0'*(dotplace-len(self._int))
fracpart = ''else:
intpart = self._int[:dotplace] or'0'
fracpart = self._int[dotplace:]
exp = leftdigits-dotplace
# done with the decimal-specific stuff; hand over the rest# of the formatting to the _format_number functionreturn _format_number(self._sign, intpart, fracpart, exp, spec)
Long story short, the Decimal.__format__
method will calculate the necessary padding to represent the number before and after the decimal based upon exponentiation provided from Decimal._exp
(in your example, 14 significant digits).
>>>d._exp
-14
Post a Comment for "Get Precise Decimal String Representation Of Python Decimal?"