Короткий ответ:
>>> d
Decimal('1E-14')
>>> '{:f}'.format(d)
'0.00000000000001'
Длинный ответ:
Как указал @BrandonRhodes PEP 3101 (то есть PEP строкового формата):
Синтаксис для спецификаторов формата является открытым, поскольку класс может переопределять стандартные спецификаторы формата.В таких случаях метод str.format () просто передает все символы между первым двоеточием и соответствующей скобкой в соответствующий базовый метод форматирования.
И, таким образом, метод Decimal.__format__
какой формат строки Python будет использовать для генерации str
представления значения Decimal
.В основном Decimal
переопределяет форматирование, чтобы оно было «умным», но по умолчанию будет использовать любые значения, которые задает строка формата (т. Е. {:.4f}
урежет десятичное число до 4 разрядов).
Вот почему вы можете доверять ему (фрагментfrom decimal.py:Decimal.__format__
):
# PEP 3101 support. the _localeconv keyword argument should be
# considered private: it's provided for ease of testing only.
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':
if not self and precision is not None:
dotplace = 1 - precision
else:
dotplace = 1
elif spec['type'] in 'fF%':
dotplace = leftdigits
elif spec['type'] in 'gG':
if self._exp <= 0 and leftdigits > -6:
dotplace = leftdigits
else:
dotplace = 1
# find digits before and after decimal point, and get exponent
if dotplace < 0:
intpart = '0'
fracpart = '0'*(-dotplace) + self._int
elif 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 function
return _format_number(self._sign, intpart, fracpart, exp, spec)
Короче говоря, метод Decimal.__format__
вычислит необходимое заполнение для представления числа до и после десятичной точки на основе возведения в степень, полученного из Decimal._exp
(в вашем примере, 14 значащих цифр).
>>> d._exp
-14