复数的格式化

23 投票
6 回答
41390 浏览
提问于 2025-04-17 04:11

在我上课的一个项目中,我们需要输出小数点后最多五位的数字。输出的结果可能是一个复数,但我不知道怎么把复数输出到小数点后五位。对于普通的小数,我知道可以这样做:

print "%0.5f"%变量名

那么对于复数,有类似的方法吗?

6 个回答

5

在Python中,字符串格式化操作,比如用百分号(%)来格式化字符串,或者用更新的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']

需要注意的是,这个方法对于负的虚部也能很好地工作。

37

你可以像下面这样使用 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-字符串

格式化字符串字面量(也叫 f-字符串)是在 Python 3.6 中新增的,这意味着在那个版本或更高版本中也可以这样做:

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-字符串支持了 = 指定符号,这项功能被添加,允许你写:

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

对于这样的问题,Python的官方文档应该是你首先要查阅的地方。特别是可以看看关于字符串格式化的部分。那里列出了所有的字符串格式代码,但没有专门针对复数的格式。

你可以单独格式化这个数字的实部和虚部,使用 x.realx.imag,然后以 a + bi 的形式打印出来。

撰写回答