四捨五入と表示桁数のまとめ 【Python】

programming Python

Python で数値を四捨五入したり、桁数を指定して文字列に変換するときによく使うサンプルコードを集約しておきます。
サンプルコードの中で欲しい出力に該当する箇所をそのままコピー&ペーストすれば使えるようにしています。
整数、小数で四捨五入の動きが異なるなど、それぞれの注意点についても、できるだけ簡潔にまとめておきます。

以下の環境で動作確認をしています。
環境: Windows 10、Python 3.X

概要

これまで、数値を文字列に変換する際、その都度、解説などを確認しながらプログラミングをしていました。
具体例と留意点がまとまっていて、かつ、欲しい結果となっているコードのみをコピー&ペーストして使えるようになっていると便利です。そこでよく使うスクリプトをまとめておきます。以下の具体例を列挙します。

① 小数の表示桁数の指定(四捨五入)
② 切り捨て・切り上げ・四捨五入
③ 整数への四捨五入(小数と挙動が異なる)
④ 金銭で使う3桁のカンマ区切り表示
⑤ スペース” “・ゼロ”0” パディング(文字埋め)
⑥ 日付表示(ゼロ埋め)

サンプルコードの説明

小数の桁数指定:”{:.3f}”.format( v1 )

・ 最初は小数の表示桁数を指定して文字列に変換するサンプルです。
なお確認のため、変換後の型 type を表示するようにしています。

Python で切り捨て math.floor( v1 )、切り上げ math.ceil( v1 )、四捨五入 round( v1 )

・ つぎは、切り捨て floor、切り上げ ceil、四捨五入 round をする関数のサンプルです。
・ 四捨五入 round() だけは標準関数になっているため、インポート等を考慮することなく、そのまま round() 関数を使用できます。
・ 切り上げ、切り捨てをしたい場合、import math とする必要があります。

四捨五入する桁を指定するとき:round( v1, 2 )

・ 続いて、round( ) で引数を2つ指定し、小数点何桁まで表示するか指定したサンプルです。
round() で、引数を1つにすると、int 型で返ってきます。しかし、引数を2つにすると float 型が返ってきます。
また、小数で、指定した桁の末尾は四捨五入となることがわかります。★

四捨五入 round( v1 ) に関する注意

・ つぎは、整数への四捨五入の例です。関数 round() で引数1つとして使います。
「整数への四捨五入」は、小数部分がちょうど 0.5 だったとき、偶数側に丸める(=切り捨てるか、あるいは、切り上げるかの扱いが値に応じて変わる)ことになっています。
そのため、結果はすべて偶数になっています。この点、小数の場合の★と挙動が異なるといえます。(小数の場合は、末尾が偶数となる場合と、奇数となる場合の両方があります。)

注意
数値計算、物理計算を行うような場合、同じ四捨五入であっても、整数演算と小数演算では四捨五入の動きが異なるため、注意が必要です。
例えば、計算速度を上げる等のため、先に1000倍(係数倍)して整数で計算しておき、表示のときに結果を1/1000倍して小数にするといった計算を行うと、係数倍する際の値に応じて計算結果が変動しうるので注意が必要です。

3桁ごとにカンマで区切るとき:”{:,d}”.format( n1 )

・ お金の計算でよく使うカンマ区切りのサンプルです。

冒頭をスペースで埋めるとき:”{:10d}”.format( n1 )

・ スペースでのパティング(スペース埋め)のサンプルです。

冒頭をゼロ埋めするとき:”{:010d}”.format( n1 )、str( n1 ).zfill( 10 )

・ 0でのパディング(ゼロ埋め、ゼロパディング)についてもサンプルを列挙しました。
{} 内の “:” の後にそのまま “10d” などと書くと、スペースパディングであって、10桁 decimal となるようフォーマットする動きになります。
一方、”:” の後に “0” を明記して “10d” などとすると、“0” パディングであって、10桁 decimal となるようフォーマットする動きになっています。
・ 文字列型で .zfill(10) を使っても動きます。

日付でゼロ埋めをするとき:dt1.datetime.now().strftime( “%Y%m%d_%H%M%S” )

・ 最後は、日付のフォーマットです。
月、日等が1桁の場合、0で埋める動きとなり、日付のフォーマットを統一できます。

まとめ

数値を文字列に変換する際によく使うスクリプトをまとめました。
注意点含め、まとまっているサイトが見つからなかったため、ポイントを一か所に集約しました。
通常出てくるものは、ほぼカバーしているかと思います。

関連リンク
・ 【scikit-learn】 LinearRegression の予測結果を整数で出力する方法

サンプルコード:数値を文字列に変換する


import math 
import datetime as dt1 

print( "--------------------------" ) 

v1 = 3.1415926535

str1 = "{:.0f}".format( v1 )     #  "{ index number: format }".format( ) 
print( str1 )                    # "3" 
str1 = "{:.1f}".format( v1 ) 
print( str1 )                    # "3.1" 
str1 = "{:.2f}".format( v1 ) 
print( str1 )                    # "3.14" 
str1 = "{:.3f}".format( v1 ) 
print( str1 )                    # "3.142" 
str1 = "{:.4f}".format( v1 ) 
print( str1 )                    # "3.1416" 
str1 = "{:.5f}".format( v1 ) 
print( str1 )                    # "3.14159" 
str1 = "{:.6f}".format( v1 ) 
print( str1 )                    # "3.141593" 
str1 = "{:.7f}".format( v1 ) 
print( str1 )                    # "3.1415927" 

print( type( str1 ) )            # <class 'str'> 

print( "--------------------------" ) 

v1 = 3.1415926535

n1 = math.floor( v1 ) 
print( n1 )                      # 3 
n1 = math.ceil( v1 ) 
print( n1 )                      # 4 
n1 = round( v1 ) 
print( n1 )                      # 3 

print( type( n1 ) )              # <class 'int'> 

print( "--------------------------" ) 

v1 = 3.1415926535

v2 = round( v1, 0 ) 
print( v2 )                      # 3.0 
v2 = round( v1, 1 ) 
print( v2 )                      # 3.1 
v2 = round( v1, 2 ) 
print( v2 )                      # 3.14 
v2 = round( v1, 3 ) 
print( v2 )                      # 3.142 
v2 = round( v1, 4 ) 
print( v2 )                      # 3.1416 
v2 = round( v1, 5 ) 
print( v2 )                      # 3.14159 
v2 = round( v1, 6 ) 
print( v2 )                      # 3.141593 
v2 = round( v1, 7 ) 
print( v2 )                      # 3.1415927 

print( type( v2 ) )              # <class 'float'> 

print( "--------------------------" ) 

v1 = -4.5 
n1 = round( v1 ) 
print( n1 )                      # -4 
v1 = -3.5 
n1 = round( v1 ) 
print( n1 )                      # -4 
v1 = -2.5 
n1 = round( v1 ) 
print( n1 )                      # -2 
v1 = -1.5 
n1 = round( v1 ) 
print( n1 )                      # -2 
v1 = -0.5 
n1 = round( v1 ) 
print( n1 )                      # 0 
v1 = 0.5 
n1 = round( v1 ) 
print( n1 )                      # 0 
v1 = 1.5 
n1 = round( v1 ) 
print( n1 )                      # 2 
v1 = 2.5 
n1 = round( v1 ) 
print( n1 )                      # 2 
v1 = 3.5 
n1 = round( v1 ) 
print( n1 )                      # 4 
v1 = 4.5 
n1 = round( v1 ) 
print( n1 )                      # 4 

print( type( n1 ) )              # <class 'int'> 

print( "--------------------------" ) 

n1 = 12345678
str1 = "{:,d}".format( n1 )
print( str1 )                    # "12,345,678"  thousands separator 

print( type( str1 ) )            # <class 'str'> 

print( "--------------------------" ) 

n1 = 12345678 

str1 = "{:10d}".format( n1 )     # "  12345678"   ' ' padding 
print( str1 ) 
str1 = "{:9d}".format( n1 )      # " 12345678" 
print( str1 ) 
str1 = "{:8d}".format( n1 )      # "12345678" 
print( str1 ) 

str1 = "{:010d}".format( n1 )    # "0012345678"   '0' padding 
print( str1 ) 
str1 = "{:09d}".format( n1 )     # "012345678" 
print( str1 ) 
str1 = "{:08d}".format( n1 )     # "12345678" 
print( str1 ) 

print( type( str1 ) )            # <class 'str'> 

str1 = str( n1 ).zfill( 10 )     # "0012345678"   '0' padding 
print( str1 ) 
str1 = str( n1 ).zfill(  9 )     # "012345678" 
print( str1 ) 
str1 = str( n1 ).zfill(  8 )     # "12345678" 
print( str1 ) 

print( type( str1 ) )            # <class 'str'> 

print( "--------------------------" ) 

str1 = dt1.datetime.now().strftime( "%Y%m%d_%H%M%S" )  # date format  YYYYmmdd
print( str1 )                    # "20210101_000000" 

str1 = dt1.datetime.now().strftime( "%y%m%d_%H%M%S" )  # date format  yymmdd
print( str1 )                    # "210101_000000" 

print( type( str1 ) )            # <class 'str'> 

print( "--------------------------" ) 

出力結果

--------------------------
3
3.1
3.14
3.142
3.1416
3.14159
3.141593
3.1415927
<class 'str'>
--------------------------
3
4
3
<class 'int'>
--------------------------
3.0
3.1
3.14
3.142
3.1416
3.14159
3.141593
3.1415927
<class 'float'>
--------------------------
-4
-4
-2
-2
0
0
2
2
4
4
<class 'int'>
--------------------------
12,345,678
<class 'str'>
--------------------------
  12345678
 12345678
12345678
0012345678
012345678
12345678
<class 'str'>
0012345678
012345678
12345678
<class 'str'>
--------------------------
2021XXXX_XXXXXX
21XXXX_XXXXXX
<class 'str'>
--------------------------

タイトルとURLをコピーしました