对于我的一个类中的项目,我们必须输出最多五位小数。输出可能是一个复数,我无法弄清楚如何输出一个带小数点后五位的复数。对于花车我知道它只是:
print "%0.5f"%variable_name
复杂数字是否有相似之处?
答案 0 :(得分:23)
您可以使用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()
方法将其用于复数。这没有明确记录,但Format Specification 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-strings
Formatted string literals(又名 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
答案 1 :(得分:4)
对于这样的问题,Python documentation应该是您的第一站。具体来说,请查看string formatting部分。它列出了所有字符串格式代码;没有一个复杂的数字。
您可以使用x.real
和x.imag
分别格式化数字的实部和虚部,并以a + bi
形式打印出来。
答案 2 :(得分:3)
>>> n = 3.4 + 2.3j
>>> print '%05f %05fi' % (n.real, n.imag)
3.400000 2.300000i
答案 3 :(得分:3)
String Formatting Operations都没有 - 即模数(%
)运算符) -
新的str.format()
Format String Syntax也不支持复杂类型。
但是,可以直接调用所有内置数值类型的__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']
请注意,这也适用于负虚部。
答案 4 :(得分: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
数字完全相同,但它们占用的空间更多,运行速度更慢;读者要小心。