Преобразование десятичного объекта в научную нотацию в Python - PullRequest
0 голосов
/ 01 июля 2018

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

У меня есть строка - my_tick = "0.0000005"

type(my_tick)
<class 'str'>

Когда я передаю это в Decimal (), объект форматируется и возвращается в научной нотации:

from decimal import *

formatted_tick = Decimal(my_tick)
print(formatted_tick)
5E-7

Если я позвоню getcontext(), я увижу, что моя точность по умолчанию установлена ​​в 28 десятичных разрядов:

getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[InvalidOperation, FloatOperation], traps=[InvalidOperation, DivisionByZero, Overflow])

Я пытался обернуть строку как число с плавающей точкой, но она все еще возвращается в научной записи:

formatted_tick = Decimal(repr(float(my_tick)))
print(formatted_tick)
5E-7

Оба результата дают десятичный объект со значением 5E-7

Для моей функции он должен оставаться десятичным объектом со значением 0.0000005, что касается форматирования, у меня может быть такая же проблема с другими числами, и я не обязательно заранее знаю точность, поэтому нативный необходимо решение, которое может обрабатывать точность от 1 до 10 десятичных знаков самостоятельно. Кто-нибудь знает, почему Decimal использует научную запись, когда точность установлена ​​на 28?

Спасибо заранее,

1 Ответ

0 голосов
/ 01 июля 2018

Формат str. отформатирует ваш номер так, как вы хотите, если вы укажете, что он должен быть выведен как float с :f следующим образом:

>>> "{:f}".format(decimal.Decimal("0.0000000005"))
"0.0000000005"

Если вы хотите, чтобы это поведение было поведением строкового представления по умолчанию для вашего десятичного числа, вы можете определить класс следующим образом:

 class NoScientificNotation(decimal.Decimal):
     def __str__(self):
         return "{:f}".format(self)

А затем используйте его как `Десятичное число:

>>> NoScientificNotation("0.0000000005")
Decimal('0.0000000005')

Без вопроса.

...