Почему в десятичном формате Python некоторые простые значения отображаются как экспоненты и как я могу предотвратить это? - PullRequest
1 голос
/ 08 марта 2012

Я понимаю значение показателей, но, как правило, при отображении десятичных значений для конечного пользователя, неспециалисту легче понять нормальные десятичные значения. Когда я выполняю следующее, я предпочитаю отображаемое десятичное значение вместо 50 вместо:

>>> Decimal('22679.6185') / Decimal('28.349523125') / 16
Decimal('5E+1')

Возможно ли это без квантования или каких-либо действий для изменения фактического значения? Кроме того, почему он отображает такое короткое значение как показатель степени и некоторые более длинные значения в их обычной десятичной форме? Это продукт разделения (ирония предназначена)?

Ответы [ 3 ]

2 голосов
/ 08 марта 2012

Вы видите представление по умолчанию, которое вы можете изменить, подклассами Decimal и переопределением __str__ и / или __repr__.

Обратите внимание, что __repr__ просто реализовано как return "Decimal('%s')" % str(self), но вы должны попытаться сохранить инвариант, eval(repr(d)) == d.

Вероятно, вас больше интересует не изменение вывода str по умолчанию или представление класса , а просто управление форматом отображения экземпляра .В этом случае вы просто сможете использовать функции str.format, например

>>> num = Decimal('5E+1')
>>> num
Decimal('5E+1')
>>> print("{:f}".format(num))
50
1 голос
/ 08 марта 2012

См .: Значимые цифры в десятичном модуле (который по общему признанию говорит вам использовать .quantize ()). Основная проблема заключается в том, что вы должны отслеживать количество значащих цифр вручную.

0 голосов
/ 08 марта 2012

Непосредственный разбор десятичного числа в целое или число с плавающей запятой, которое вы хотите.

int(decimal.Decimal('22679.6185') / decimal.Decimal('28.349523125') / 16)

или

float(decimal.Decimal('22679.6185') / decimal.Decimal('28.349523125') / 16)

22679.6185 / 28.349523125 в точности равно 800. И показывает десятичное число ("8E2") без каких-либо ошибок.

точность зависит от объекта контекста. проверьте это с помощью «decimal.getcontext ()». Это выглядит следующим образом:

Context(prec=28, rounding=ROUND_HALF_EVEN, ....)

«Пред» - это то, что вы хотите. Попробуйте это.

 decimal.Decimal("42.5") / decimal.Decimal("37.1")

В результате получается 28 значащих цифр.

...