22

私のクラスの 1 つのプロジェクトでは、小数点以下 5 桁までの数値を出力する必要があります。出力が複素数になる可能性があり、小数点以下 5 桁の複素数を出力する方法がわかりません。フロートの場合は、次のとおりです。

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()これは明示的に文書化されていませんが、次のように述べている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
于 2013-01-27T14:05:34.240 に答える
4

このような質問については、Python のドキュメントを最初に読む必要があります。具体的には、文字列の書式設定に関するセクションをご覧ください。すべての文字列形式コードを一覧表示します。複素数用のものはありません。

できることは、 と を使用して、数値の実部と虚部を別々にフォーマットx.realx.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 に答える