22

对于我的一个课程中的一个项目,我们必须输出最多五位小数的数字。输出可能是一个复数,我无法弄清楚如何输出一个小数点后五位的复数。对于花车,我知道它只是:

print "%0.5f"%variable_name

复数有类似的东西吗?

4

6 回答 6

34

您可以使用以下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)'

更新 - 更简单的方法

尽管您不能使用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()通过该方法将其与复数一起使用。这没有明确记录,但格式规范迷你语言文档暗示了这一点,它只是说:

'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 字符串

Python 3.6 中添加了格式化字符串文字(又名f-strings),这意味着在该版本或更高版本中也可以这样做:

print(f'n1: {n1:.2f}')  # -> n1: 3.40+2.30j
print(f'n2: {n2:.3f}')  # -> n2: 3.400-2.300j

在 Python 3.8.0 中, f-strings添加=了对说明符的支持,允许您编写:

print(f'{n1=:.2f}')  # -> n1=3.40+2.30j
print(f'{n2=:.3f}')  # -> n2=3.400-2.300j
于 2013-01-27T14:05:34.240 回答
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']

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

于 2014-09-07T07:17:26.877 回答
4

对于这样的问题,Python 文档应该是您的第一站。具体来说,请查看字符串格式化部分。它列出了所有的字符串格式代码;没有一个用于复数。

您可以做的是分别格式化数字的实部和虚部,使用x.realand x.imag,并以表格形式打印出来a + bi

于 2011-10-12T20:34:18.567 回答
3
>>> n = 3.4 + 2.3j
>>> print '%05f %05fi' % (n.real, n.imag)
3.400000 2.300000i
于 2011-10-12T20:37:50.233 回答
1

从 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数字完全一样,只是它们占用更多空间并且操作更慢;读者当心。

于 2014-08-02T23:27:32.467 回答
0

看一下这个:

np.set_printoptions(precision=2)  # Rounds up to 2 decimals all float expressions

我已经成功打印了我的 complexfloat 表达式:

# Show poles and zeros
print( "zeros = ", zeros_H , "\n")
print( "poles = ", poles_H )

之前出:

zeros =  [-0.8       +0.6j -0.8       -0.6j -0.66666667+0.j ] 

poles =  [-0.81542318+0.60991027j -0.81542318-0.60991027j -0.8358203 +0.j        ]

出来之后:

zeros =  [-0.8 +0.6j -0.8 -0.6j -0.67+0.j ] 

poles =  [-0.82+0.61j -0.82-0.61j -0.84+0.j  ]
于 2021-11-23T14:59:29.297 回答