格式化复数

isl*_*per 17 python formatting complex-numbers number-formatting

对于我的一个类中的项目,我们必须输出最多五位小数.输出可能是一个复数,我无法弄清楚如何输出一个带有五位小数的复数.对于花车我知道它只是:

print "%0.5f"%variable_name

复杂的数字有类似的东西吗?

mar*_*eau 25

您可以使用以下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)'
Run Code Online (Sandbox Code Playgroud)

为了使它正确处理正和虚部分,你需要一个(甚至更复杂的)复杂的格式化操作:

>>> 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)'
Run Code Online (Sandbox Code Playgroud)

更新 - 更轻松的方式

虽然您不能使用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))
Run Code Online (Sandbox Code Playgroud)

输出:

TypeError: float argument required, not complex
Run Code Online (Sandbox Code Playgroud)

但是,您可以通过该str.format()方法使用复数.这没有明确记录,但是格式规范迷你语言文档暗示:

'f'  固定点.将数字显示为定点数.默认精度为6.

..所以很容易被忽视.具体而言,以下适用于Python 2.7.14和3.4.6:

print('n1: {:.2f}'.format(n1))
print('n2: {:.2f}'.format(n2))
Run Code Online (Sandbox Code Playgroud)

输出:

n1: 3.10+4.20j
n2: 3.10-4.20j
Run Code Online (Sandbox Code Playgroud)

这并不能完全控制我原来答案中的代码,但它确实更简洁(并自动处理正负虚部分).


Dav*_*d Z 5

对于此类问题,Python文档应该是您的第一站。具体来说,请参见有关字符串格式的部分。它列出了所有字符串格式代码;复数没有一个。

您可以做的是使用x.real和分别格式化数字的实部和虚部x.imag,并将其打印成a + bi表格。

  • 请注意,在Python中,虚部使用`j`。 (3认同)

mar*_*ink 5

字符串格式化操作(即模 ( %) 运算符)和较新的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']
Run Code Online (Sandbox Code Playgroud)

请注意,这也适用于负虚部。