小数点以下2桁を常に表示するように小数点をフォーマットするにはどうすればよいですか?


237

表示したい:

49 なので 49.00

そして:

54.9 なので 54.90

小数点以下の長さや小数点以下の桁数に関係なく、小数点以下Decimal2桁で表示したいのですが、効率的に表示したいのですが。目的は、金額を表示することです。

例えば、 4898489.00


4
できるだけ長くする必要がありますか?どういう意味ですか?メモリ不足になるまで先行ゼロを追加することもできますが、それはあなたが望んでいることではないのではないかと思います...
Mark Byers

これは、OPがdecimal.Decimalを使用しており、「厳密な意味でのn桁の精度」のように精度をn桁に制限する10進コンテキストの精度に不満があることを意味している可能性があります(たとえば、 '123.456'はDecimal( '1.2E + 2 '))ではなく、「小数部のn桁」ではありません(Decimal(' 123.45 ')の場合)...これについて役立つ試みについては、私の回答を参照してください。;-)
のMichałMarczyk

1
はい、それらはお金の価値のためです。
orokusaki

回答:


105

おそらくモジュールのDecimal()オブジェクトを使用していると思いますdecimalか?(もしあなたが任意に大きな数で小数点を越えて正確に2桁の精度が必要なら、あなたは間違いなくそうすべきであり、それがあなたの質問のタイトルが示唆していることです...)

その場合は、ドキュメントの10進数のFAQセクションに、質問と回答のペアが含まれていると便利です。

Q.小数点以下2桁の固定小数点アプリケーションでは、入力によっては桁数が多く、四捨五入する必要があります。その他は、桁数が多いはずがないため、検証する必要があります。どのような方法を使用する必要がありますか?

A.quantize()メソッドは、固定小数点以下の桁数に丸めます。不正確なトラップが設定されている場合は、検証にも役立ちます。

>>> TWOPLACES = Decimal(10) ** -2       # same as Decimal('0.01')
>>> # Round to two places
>>> Decimal('3.214').quantize(TWOPLACES)
Decimal('3.21')
>>> # Validate that a number does not exceed two places
>>> Decimal('3.21').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Decimal('3.21')
>>> Decimal('3.214').quantize(TWOPLACES, context=Context(traps=[Inexact]))
Traceback (most recent call last):
   ...
Inexact: None

次の質問は

Q.有効な2つの場所の入力を取得したら、アプリケーション全体でその不変条件をどのように維持しますか?

(他の多くの有用な情報とともに)その答えが必要な場合は、ドキュメントの前述のセクションを参照してください。また、Decimal小数点以下2桁の精度でsを保持する場合(すべての桁を小数点の左側に、右側に2桁を維持するために必要なだけの精度を意味します...)、それからそれらを文字列に変換するとstrうまくいきます:

str(Decimal('10'))
# -> '10'
str(Decimal('10.00'))
# -> '10.00'
str(Decimal('10.000'))
# -> '10.000'

2
ああ、答えの効率について言及するのを忘れていました...しかし、私はとにかく専門家ではないと思います。固定数の「小数桁」を保持することが特に非効率的である理由はありません。ただし、数値に対して実行される演算では、結果に丸め演算を実行して要件に合わせる必要がある場合があります。効率化のために、これはおそらくできるだけ頻繁に行われるべきではありません-ユーザーのシリアル化/印刷の直前などです。
のMichałMarczyk

517

あなたは使うべき新しいフォーマットの仕様を、あなたの価値を表現する方法を定義するには:

>>> from math import pi  # pi ~ 3.141592653589793
>>> '{0:.2f}'.format(pi)
'3.14'

ドキュメンテーションは時々少しあいまいになる可能性があるため、以下の、読みやすいリファレンスをお勧めします。

Python 3.6はリテラル文字列補間(f文字列とも呼ばれます)を導入したので、上記をさらに簡潔に次のように記述できます。

>>> f'{pi:.2f}'
'3.14'

4
@Droogans:Euh ... formatはを返しますがstrfloatprint type({0:.2f}".format(pi))は返しません<type 'str'>
BioGeek

おっとっと。動詞の単語のオーバーロードreturn。精神的にprintsに変えてください。
Droogans

20
数値のプレースホルダーを使用したくない場合:"{:.2f}".format(pi)
ユーザー

何をし0:ますか?これ.はpython文字列の一部だと思います
information_interchange

135

Pythonドキュメントの文字列フォーマット操作セクションには、探している答えが含まれています。要するに:

"%0.2f" % (num,)

いくつかの例:

>>> "%0.2f" % 10
'10.00'
>>> "%0.2f" % 1000
'1000.00'
>>> "%0.2f" % 10.1
'10.10'
>>> "%0.2f" % 10.120
'10.12'
>>> "%0.2f" % 10.126
'10.13'

必要ありません0%、およびラップする必要はありませんnumではtuple
user238424 2010年

17
実際、タプルでnumをラップすることは、文字列のフォーマット中に引数のダック入力エラーを防ぐためのコーディング規約です。この場合、float変換を使用しても効果はありませんが、文字列に変換するときに予期しない型エラーが発生するのを防ぎます。r = 1; "%s" % r; r = (1, 2); "%s" % r対を検討してくださいr = 1; "%s" % (r,); r = (1,2 ); "%s" % (r,)。そのため、Pythonの最も洗練されたコーディングスタイルでは現在、無条件のタプルが使用されています(Python 3では、エラーが発生しやすい文字列フォーマットのメソッド全体が非推奨になりました)。
Travis Bradshaw

また、数学の背景を持つ人として、「裸の」10進表記は醜いです。先頭の0は何も害を与えず、見栄えもよくなります。:)
Travis Bradshaw

3
審美的に違いはありません。いずれにしても、最も重要なのは0がデフォルト値です。美的に満足のいくコードを作成するのであれば、デフォルトを提供してもまったく害はありません。正確さとスタイルを区別しないことを選択する(選択できない)ことが多くの開発者にとって興味深いことです。:/
Travis Bradshaw

32

文字列フォーマット演算子を次のように使用できます。

num = 49
x = "%.2f" % num  # x is now the string "49.00"

「効率的」とはどういう意味かわかりません。これはほとんどの場合、アプリケーションのボトルネックではありません。プログラムの実行速度が遅い場合は、まずプロファイルを作成してホットスポットを見つけ、次にそれらを最適化します。


1
「f」という名前の変数は一部の人々を混乱させるかもしれません。以下のTravisのような例では、別の名前で呼ぶ方がよいでしょう。
Aleck Landgraf

28
>>> print "{:.2f}".format(1.123456)
1.12

あなたは変更することができます22f表示したい小数点以下のいずれかの番号に。

編集:

からPython3.6、これは次のように変換されます。

>>> print(f"{1.1234:.2f}")
1.12

19

.formatは、変数のフォーマットを処理するためのより読みやすい方法です。

'{:.{prec}f}'.format(26.034, prec=2)


6

複数のパラメータがある場合は、使用できます

 print('some string {0:.2f} & {1:.2f}'.format(1.1234,2.345))
 >>> some string 1.12 & 2.35

3

これを通貨に使用していて、値をで区切る,場合は、

$ {:,.f2}.format(currency_value)

例えば:

currency_value = 1234.50

$ {:,.f2}.format(currency_value) --> $ 1,234.50

少し前に書いたコードを次に示します。

print("> At the end of year " + year_string + " total paid is \t$ {:,.2f}".format(total_paid))

> At the end of year   1  total paid is         $ 43,806.36
> At the end of year   2  total paid is         $ 87,612.72
> At the end of year   3  total paid is         $ 131,419.08
> At the end of year   4  total paid is         $ 175,225.44
> At the end of year   5  total paid is         $ 219,031.80   <-- Note .80 and not .8
> At the end of year   6  total paid is         $ 262,838.16
> At the end of year   7  total paid is         $ 306,644.52
> At the end of year   8  total paid is         $ 350,450.88
> At the end of year   9  total paid is         $ 394,257.24
> At the end of year  10  total paid is         $ 438,063.60   <-- Note .60 and not .6
> At the end of year  11  total paid is         $ 481,869.96
> At the end of year  12  total paid is         $ 525,676.32
> At the end of year  13  total paid is         $ 569,482.68
> At the end of year  14  total paid is         $ 613,289.04
> At the end of year  15  total paid is         $ 657,095.40   <-- Note .40 and not .4  
> At the end of year  16  total paid is         $ 700,901.76
> At the end of year  17  total paid is         $ 744,708.12
> At the end of year  18  total paid is         $ 788,514.48
> At the end of year  19  total paid is         $ 832,320.84
> At the end of year  20  total paid is         $ 876,127.20   <-- Note .20 and not .2

0

その方法を示す最も簡単な方法の例は次のとおりです。

コード:

>>> points = 19.5 >>> total = 22 >>>'Correct answers: {:.2%}'.format(points/total) `

出力:正解:88.64%


弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.