Форматирование сложных чисел - PullRequest
15 голосов
/ 13 октября 2011

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

print "%0.5f"%variable_name

Есть ли что-то похожее для комплексных чисел?

Ответы [ 5 ]

23 голосов
/ 27 января 2013

Вы можете сделать это, как показано ниже, используя метод str.format():

>>> n = 3.4+2.3j
>>> n
(3.4+2.3j)
>>> '({0.real:.2f} + {0.imag:.2f}i)'.format(n)
'(3.40 + 2.30i)'
>>> '({c.real:.2f} + {c.imag:.2f}i)'.format(c=n)
'(3.40 + 2.30i)'

Чтобы правильно обрабатывать как положительные, так и отрицательные мнимые части, вам потребуется (даже более) сложная операция форматирования:

>>> n = 3.4-2.3j
>>> n
(3.4-2.3j)
>>> '({0:.2f} {1} {2:.2f}i)'.format(n.real, '+-'[n.imag < 0], abs(n.imag))
'(3.40 - 2.30i)'

Обновление - Easy Way

Хотя вы не можете использовать f в качестве типа представления для комплексных чисел, используя оператор форматирования строки %:

n1 = 3.4+2.3j
n2 = 3.4-2.3j

try:
    print('test: %.2f' % n1)
except Exception as exc:
    print('{}: {}'.format(type(exc).__name__, exc))

Выход:

TypeError: float argument required, not complex

Вы можете , однако используйте его с комплексными числами с помощью метода str.format(). Это явно не задокументировано, но подразумевается спецификацией формата Mini-Language , которая просто гласит:

'f' Фиксированная точка. Отображает номер как число с фиксированной точкой. Точность по умолчанию 6.

. , .так легко пропустить. Конкретно, в Python 2.7.14 и 3.4.6 работает следующее:

print('n1: {:.2f}'.format(n1))
print('n2: {:.2f}'.format(n2))

Выход:

n1: 3.10+4.20j
n2: 3.10-4.20j

Это не дает вам достаточного контроля, который дает код в моем исходном ответе, но, безусловно, гораздо более кратко (и обрабатывает как положительные, так и отрицательные мнимые части автоматически).

Обновление 2 - f-строк

Отформатированные строковые литералы (он же f-strings ) добавлены в Python 3.6, что означает, что это также может быть сделано в этой версии или позже:

print(f'n1: {n1:.2f}')  # -> n1: 3.40+2.30j
print(f'n2: {n2:.3f}')  # -> n2: 3.400-2.300j
4 голосов
/ 13 октября 2011

Для подобных вопросов документация Python должна быть вашей первой остановкой. В частности, взгляните на раздел форматирование строки . В нем перечислены все коды формата строки; нет одного для комплексных чисел.

Что вы можете сделать, это отформатировать действительные и мнимые части числа по отдельности, используя x.real и x.imag, и распечатать их в форме a + bi.

3 голосов
/ 07 сентября 2014

Ни Операции форматирования строки - т.е. оператор по модулю (%)), ни более новый str.format() Синтаксис строки формата не поддерживает сложные типы.Однако можно напрямую вызывать метод __format__ для всех встроенных числовых типов.Вот пример:

>>> i = -3 # int
>>> l = -33L # long (only Python 2.X)
>>> f = -10./3 # float
>>> c = - 1./9 - 2.j/9 # complex
>>> [ x.__format__('.3f') for x in (i, l, f, c)]
['-3.000', '-33.000', '-3.333', '-0.111-0.222j']

Обратите внимание, что это хорошо работает и с отрицательными мнимыми частями.

3 голосов
/ 13 октября 2011
>>> n = 3.4 + 2.3j
>>> print '%05f %05fi' % (n.real, n.imag)
3.400000 2.300000i
1 голос
/ 03 августа 2014

Начиная с Python 2.6 вы можете определить, как объекты ваших собственных классов реагируют на строки формата. Таким образом, вы можете определить подкласс complex, который можно отформатировать. Вот пример:

>>> class Complex_formatted(complex):
...     def __format__(self, fmt):
...         cfmt = "({:" + fmt + "}{:+" + fmt + "}j)"
...         return cfmt.format(self.real, self.imag)
... 
>>> z1 = Complex_formatted(.123456789 + 123.456789j)
>>> z2 = Complex_formatted(.123456789 - 123.456789j)
>>> "My complex numbers are {:0.5f} and {:0.5f}.".format(z1, z2)
'My complex numbers are (0.12346+123.45679j) and (0.12346-123.45679j).'
>>> "My complex numbers are {:0.6f} and {:0.6f}.".format(z1, z2)
'My complex numbers are (0.123457+123.456789j) and (0.123457-123.456789j).'

Объекты этого класса ведут себя точно так же, как числа complex, за исключением того, что они занимают больше места и работают медленнее; читатель остерегайтесь.

...