私のクラスの 1 つのプロジェクトでは、小数点以下 5 桁までの数値を出力する必要があります。出力が複素数になる可能性があり、小数点以下 5 桁の複素数を出力する方法がわかりません。フロートの場合は、次のとおりです。
print "%0.5f"%variable_name
複素数に似たものはありますか?
私のクラスの 1 つのプロジェクトでは、小数点以下 5 桁までの数値を出力する必要があります。出力が複素数になる可能性があり、小数点以下 5 桁の複素数を出力する方法がわかりません。フロートの場合は、次のとおりです。
print "%0.5f"%variable_name
複素数に似たものはありますか?
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
フォーマットされた文字列リテラル(別名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
Python 3.8.0 では、=
指定子のサポートが f-stringsに追加され、次のように記述できるようになりました。
print(f'{n1=:.2f}') # -> n1=3.40+2.30j
print(f'{n2=:.3f}') # -> n2=3.400-2.300j
このような質問については、Python のドキュメントを最初に読む必要があります。具体的には、文字列の書式設定に関するセクションをご覧ください。すべての文字列形式コードを一覧表示します。複素数用のものはありません。
できることは、 と を使用して、数値の実部と虚部を別々にフォーマットx.real
しx.imag
、フォームに出力するa + bi
ことです。
>>> n = 3.4 + 2.3j
>>> print '%05f %05fi' % (n.real, n.imag)
3.400000 2.300000i
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
より多くのスペースを取り、よりゆっくりと動作することを除いて、数値とまったく同じように動作します。読者は注意してください。