printで出力する数値の桁数を操作するにはformatメソッドを使います。formatメソッドが初めての方は『Pythonのprintのformatdで知っておきたい操作まとめ』をご確認ください。
ここでは、まず数値の位取りからはじめて、formatメソッドで、数値の桁数や小数点以下の桁数、指数の桁数を操作する方法を詳しく解説します。また記事の最後で、formatメソッドよりもさらに理想的な方法を紹介しています。
ぜひ、最後までご覧ください。
1. printで出力する数値の位取り
数値の位取りを行なった上で出力するには、置換フィールドに {:,} とコロンとカンマを入力します。以下の例をご覧ください。
#3桁ずつの位取り
print('{:,}'.format(1000000))
Python3.6以降は、以下のように、位取りの記号にアンダースコア(_)も使えるようになりました。
#Python3.6以降は位取りにアンダースコア(_)も使えます。
print('{:_}'.format(1000000))
なお当たり前かもしれませんが、位取りされるのは整数部分のみで小数点以下の部分は無関係です。以下をご覧ください。
#小数点以下は位取りされません。
num = 1000000.12345
print('{:,}'.format(num))
print('{:_}'.format(num))
文字列の中に埋め込んで使ってみましょう。
#文字列に埋め込むには次のように書きます。
text = "山田選手の合計得点は{:,}でした。"
num = 1234.567
print(text.format(num))
2. printで出力する数値の桁数の操作
出力する数値の桁数を指定したい場合は、置換フィールドの中に {:.○g}と書きます。コロン(:)の後にピリオド(.)を書き○gで桁数を指定します。2桁まで表示したいなら2g、3桁まで表示したいなら3gと書きます。
早速確認しましょう。
#表示する桁数を指定するには次のように書きます。
print('{:.2g}'.format(1234567)) #2桁まで表示
print('{:.3g}'.format(1234.567)) #3桁まで表示
print('{:.3g}'.format(123.4567)) #3桁まで表示
print('{:.4g}'.format(1234.567)) #4桁まで表示
print('{:.5g}'.format(0.1234567)) #5桁まで表示
#実際の桁数よりも長く指定しても変化はありません。
print('{:.10g}'.format(0.1234567)) #10桁まで指定
このように指定の桁数で表示されます。表示しきれない部分は指数表記になります。例えば「1.2e+06」は「1.2×10の6乗=1200000」ですし、「1.23e+03」は「1.23×10の3乗=1230」です。
いちばん最後に、実際の数値の桁数よりも大きい桁数を、痴漢フィールドで指定しています。その場合は何も変化はありません。
注意!四捨五入ではない。
なお桁数指定の時は、指定した桁のところで四捨五入されているように見えますが、実際は四捨五入ではなく「丸め」です。以下をご覧ください。
#注意!数値は四捨五入ではなく偶数側への「丸め」です。
print('{:.2g}'.format(15.5))
print('{:.2g}'.format(16.5))
print('{:.1g}'.format(15))
print('{:.1g}'.format(25))
15.5を四捨五入すると16で、16.5を四捨五入すると17です。しかし出力結果を見ると両方とも16になっています。また15を四捨五入すると20で、25を四捨五入すると30です。しかし、出力結果では両方とも20です。この原因は、数値は四捨五入されているのではなく「丸め」という処理をされているからです。
丸めとは、どちらか近い方に数値を丸めるというものです。例えば、12.3は13よりも12に近いですね。だから12.3は12になります。12.7は12よりも13に近いですね。だから12.7は13になります。
それでは、12.5の場合はどうでしょう。12への距離も13への距離も0.5で同じです。丸めでは、このような場合、偶数側に寄せます。
formatメソッドの数値操作は、このように四捨五入ではなくて丸めだということをしっかりと覚えておきましょう。
さて、それでは、この数値の桁指定を文字列に埋め込んでprint関数で出力してみましょう。
#文字列の中に埋め込むには、こう書きます。
text = '100×100は{:.2g}です。'
num = 10000
print(text.format(num))
#もう一つ
text = '-100×100は{:.3g}です。'
num = -10000
print(text.format(num))
簡単ですね。もし分からない場合は『Pythonのprint時に知っておきたいformatメソッドの使い方』でご確認ください。
次の例は、位取りと桁数指定を同時に行なっているものです。{:,.5g}と位取りと桁数指定を続けて書いています。組み合わせて使う場合は、コロン(:)は最初の一つだけです。{:,:.5g}とコロンをいちいち書く必要はありませんので覚えておきましょう。
#位取りと桁数指定を同時に行ってみましょう。
text = "ただいまの山田選手のポイントは{:,.5g}です。"
point = 1025.46812
print(text.format(point))
3. printで小数点以下の桁数を指定して出力
小数点以下の桁数を指定してprintするには、置換フィールドに{:.○f}と書きます。先ほどのgがfになっただけですね。ちなみにこの’f’は、’floating point numbers(浮動小数点数)’の’f’です。
早速見てみましょう。
#小数点以下の桁数を指定する。
pi = 3.141592
#今回は引数に数値を代入した変数を渡します。
print('{:.1f}'.format(pi)) #小数点以下1位
print('{:.2f}'.format(pi)) #小数点以下2位
print('{:.3f}'.format(pi)) #小数点以下3位
小数点以下の桁数を指定した時も、数値全体の桁数を指定した時と同じく、その箇所で丸められます。もう一度、次のコードでおさらいしておきましょう。
#注意!数値は四捨五入ではなく偶数側に丸められます。
print('{:.0f}'.format(1.5))
print('{:.0f}'.format(2.5))
print('{:.1f}'.format(1.55))
print('{:.1f}'.format(1.65))
「丸め」では、数値は近い方向に丸められます。1.5は、1から0.5離れており、2からも0.5離れています。距離が一緒なので偶数側である2に丸められます。2.5も同様です。2から0.5離れており、3からも0.5離れています。距離が一緒なので、これも偶数側である2に丸められます。3にはならないので注意しましょう。1.55も1.65一緒ですね。どちらも偶数側である1.6に丸められます。
なお、小数点の場合は、実際の数値よりも多い桁数を指定すると0で埋めます。これは全体の桁数を指定した時と異なるので混乱しないようにしてくださいね。
#実際よりも長い桁数を指定すると0が続きます。
print('{:.2f}'.format(3)) #小数点以下2位
print('{:.4f}'.format(3.14)) #小数点以下4位
#桁数を指定しないと小数点以下6位になります。
print('{:f}'.format(3.14))
print('{:f}'.format(3.1415926535))
それでは、文字列に埋め込んで見ましょう。
#文字列の中に埋め込むにはこう書きます。
text = '円周率は約{:.2f}です。'
pi = 3.141592
print(text.format(pi))
位取りと小数点以下の桁数指定を同時に行う方法も、先ほどと同じです。{:,.○f}と書きます。{:,:.○f}のようにコロン (:)を2つ書く必要はありません。コロンは先頭に一つだけなので覚えておきましょう。
#位取りと小数点の桁数指定を同時に行ってみましょう。
text = "ただいまの山田選手のポイントは{:,.1f}です。"
point = 5.46812
print(text.format(point))
4. printで指数の小数点以下の桁数を指定して出力
指数を桁数を指定した上で出力したい場合には、{:.○e}と書きます。全体の数値の桁指定には g ‘digits’、小数点以下の桁指定には f ‘floating point numbers’、指数の桁指定には e ‘exponential(指数)’ と覚えておくと良いでしょう。
e は小文字でも大文字でも構いません。
それでは以下をご覧ください。
#小数点以下の桁数を指定して指数にしたい場合は次のように書きます。
print('{:.3e}'.format(12345)) #小数点以下3位の指数
print('{:.2E}'.format(0.12345)) #小数点以下2位の指数
なお、桁数を指定しない場合は小数点以下6位まで出力されます。
#桁数を指定しないと自動的に小数点以下6位まで出力されます。
print('{:e}'.format(12345))
print('{:E}'.format(0.12345))
print('{:e}'.format(0.123456789))
上記と同じように数値は四捨五入ではなく「丸め」です。
ちなみにformatメソッドの場合、置換フィールドに何も指定しなくても、10の-5乗または10の16乗からは、自動的に指数表記になります。
#なお、浮動小数点の場合、指定しなくても10の-5乗または10の16乗から指数表記になります。
print('{}'.format(0.0001200))
print('{}'.format(0.00001200)) #10のマイナス5乗から自動的に指数変換
print('{}'.format(120000000000.0))
print('{}'.format(12000000000000000.0)) #10の16乗から自動的に指数変換
#ただし浮動小数点でない数字は、指数表記にはなりません。
print('{}'.format(12000000000000000))
ただし、最後の行で見られるように、自動的に指数表記になるのは小数点以下の数字がある数値だけです。整数では、そうなりませんので注意しましょう。
それでは、これを文字列に含んで出力してみましょう。
#文字列に埋め込んでみましょう。
text = '1000000を指数で表すと{:.1e}です。'
num = 1000000
print(text.format(num))
5. [重要!] formatメソッドより良い書きかた
Python3.6以降は、fプリフィクスという書きかたが追加されました。これはformatメソッドを使った書きかたよりも、
- さらに簡潔なコードになる。
- さらに負荷が少ない。
という点で、Pythonプログラマーにとって必須の書きかたです。Pythonコミュニティでは、この書きかたをしている人の方がより腕が良いと信頼されますので、ここで触れておきたいと思います。
なお、これは『Pythonの文字列変数で必ず知っておくべき操作まとめ』でも解説していますので、併せてお読み頂ければと思います。
この記事内で解説してきた位取りや桁指定、小数点以下の指定、指数表示の指定は次のように書きます。
num = 123456.789
print(f'{num:,}') #位取り
print(f'{num:.3g}') #3桁まで表示
print(f'{num:.1f}') #小数点以下1位まで表示
print(f'{num:.2e}') #小数点以下2位までの指数で表示
もちろん、位取りや桁指定を組み合わせて書くこともできます。
point = 1025.46812
print(f'{point:,.5g}') #位取り+全体の桁数の指定
print(f'{point:,.3f}') #位取り+小数点以下の桁数の指定
次のように文字列の中で使うのがfプリフィクスの真骨頂です。最初にfと書いて、その後にクオートで囲んで、置換フィールドを含む文字列を書きます。
#テキストと同時に出力してみましょう。
pi = 3.14159265
print(f'円周率は約{pi:.2f}です。')
#fプリフィクスそのものを変数に代入することもできます。
point = 1025.46812
text = f'山田選手の得点は{point:,.1f}です。'
print(text)
最初はformatメソッドを使った書きかたから覚えて頂ければ良いですが、よりベストなコードを目指すには、このfプリフィクスをマスターしましょう。
コメント