本記事では、Pythonで四捨五入、切り上げ、切り捨てする方法を、「変数」、「配列」、「numpyの配列」、「PandasのDataFrame」の各ケースごとに紹介します。
こんな人におすすめ
- Pythonの変数を四捨五入、切り上げ、切り捨てしたい
- Pythonの配列を一気に四捨五入、切り上げ、切り捨てしたい
- numpyの配列を一気に四捨五入、切り上げ、切り捨てしたい
- pandaのDataFrameを一気に四捨五入、切り上げ、切り捨てしたい
主なライブラリ
- decimal
- math
- pandas
- numpy
本ページで使用するライブラリをインポートするときは以下のコードを使用します。
import math from pandas as pd from numpy as np from decimal import Decimal, ROUND_HALF_UP, ROUND_HALF_UP, ROUND_DOWN, ROUND_UP
Python変数(四捨五入)
decimalライブラリのDecimal.quantizeを使用して、Pythonの変数を四捨五入します。
引数は以下のように設定します。
Decimalの引数 :四捨五入したい変数を文字列型で設定。
quantizeの第1引数:四捨五入後の小数点の桁数を「Decimal(文字列型)」の形で設定。
quantizeの第2引数:「rounding=ROUND_HALF_UP」を設定。
i = 1.234 print(Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_HALF_UP)) # ⇒ 1 print(Decimal(str(i)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP)) # ⇒ 1.2 print(Decimal(str(i)).quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)) # ⇒ 1.23
Python変数の四捨五入では、round関数が良く使われます。round関数を利用する方が簡単ですが、正確な四捨五入ができないケースがあります。
round関数のサンプルコードも下記に載せておきますが、正確な結果が必要な時はdecimal関数を使いましょう。
# 正しい四捨五入の結果は5だが、round関数は「偶数丸め」をしているため、4が返ってくる。 i = 4.5 print(round(i)) # ⇒ 4 # 正しい結果が返ってくる j = 5.5 print(round(j)) # ⇒ 6
Python変数(切り上げ)
math.ceil関数を使用して、Pythonの変数を切り上げします。
i = 1.2345 # 小数点第1位を切り上げる print(math.ceil(i)) # ⇒ 2 # 小数点第2位を切り上げる print(math.ceil(i * 10) / 10) # ⇒ 1.3
decimal関数を使った切り上げも可能です。
i = 1.2345 # 小数点第1位を切り上げる print(Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_UP)) # ⇒ 2 # 小数点第2位を切り上げる print(Decimal(str(i)).quantize(Decimal('.1'), rounding=ROUND_UP)) # ⇒ 1.3
Python変数(切り捨て)
math.floor関数を使用して、Pythonの変数を切り捨てします。
i = 1.2345 # 小数点第1位を切り捨てる print(math.floor(i)) # ⇒ 1 # 小数点第2位を切り捨てる print(math.floor(i * 10) / 10) # ⇒ 1.2
decimal関数を使った切り捨ても可能です。
i = 1.2345 # 小数点第1位を切り捨てる print(Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_DOWN)) # ⇒ 1 # 小数点第2位を切り捨てる print(Decimal(str(i)).quantize(Decimal('.1'), rounding=ROUND_DOWN)) # ⇒ 1.2
Python配列(四捨五入)
Pythonの配列を四捨五入するときは、配列内の数値を直接四捨五入する関数はありません。
繰り返し処理を使って四捨五入を行いましょう。
print([Decimal(str(i)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP) for i in list1]) # ⇒ [1.2, 3.5, 5.7] print([round(i, 1) for i in list1]) # ⇒ [1.2, 3.5, 5.7]
Decimalを利用した四捨五入処理は実行すると、[Decimal(‘1.2’) Decimal(‘3.5’) Decimal(‘5.7’)]と表記されますが、[1.2, 3.5, 5.7]と同じように扱えます。
Python配列(切り上げ)
四捨五入と同様に、配列内の数値を直接切り上げする関数はないため、繰り返し処理を使って切り上げを行います。
print([math.ceil(i) for i in list1]) # ⇒ [2, 4, 6]
Python配列(切り捨て)
四捨五入と同様に、配列内の数値を直接切り捨てする関数はないため、繰り返し処理を使って切り捨てを行います。
print([math.floor(i) for i in list1]) # ⇒ [1, 3, 5]
numpy配列(四捨五入)
numpyの配列については、偶数丸めを行うnp.round関数はありますが、厳密に四捨五入する関数は準備されていません。厳密に四捨五入したい場合には、関数を作成する必要があります。
偶数丸めで問題ない場合は、np.round関数が利用できます。
list2 = np.array([[1.234, 3.456, 5.678], [5.432, 6.543, 8.765]]) # decimalを利用する場合 def func_ROUND_HALF_UP(x): return Decimal(str(x)).quantize(Decimal('0.1'), rounding=ROUND_HALF_UP) print(np.vectorize(func_ROUND_HALF_UP)(list2)) # [[Decimal('1.2') Decimal('3.5') Decimal('5.7')] # [Decimal('5.4') Decimal('6.5') Decimal('8.8')]] # roundを利用する場合 print(np.round(list2, 1)) # [[1.2 3.5 5.7] # [5.4 6.5 8.8]]
Decimalを利用した四捨五入処理は実行すると、[Decimal(‘1.2’) Decimal(‘3.5’) Decimal(‘5.7’)] [Decimal(‘5.4’) Decimal(‘6.5’) Decimal(‘8.8’)]と表記されますが、[[1.2, 3.5, 5.7] [5.4,6.5,8.8]]と同じように扱えます。
numpy配列(切り上げ)
np.ceil関数を利用して、numpy配列の切り上げを行うことができます。
list2 = np.array([[1.234, 3.456, 5.678], [5.432, 6.543, 8.765]]) print(np.ceil(list2)) # [[2. 4. 6.] # [6. 7. 9.]]
numpy配列(切り捨て)
np.floor関数を利用して、numpy配列の切り捨てを行うことができます。
list2 = np.array([[1.234, 3.456, 5.678], [5.432, 6.543, 8.765]]) print(np.floor(list2)) # [[1. 3. 5.] # [5. 6. 8.]]
pandasのDataFrame(四捨五入)
pandasのDataFrameにもround関数が準備されていますが、こちらも偶数丸めの処理になります。
厳密に四捨五入したい場合は、自作の関数を使いましょう。
DataFrameのagg関数を使うと、自作の関数を適用できます。
df = pd.DataFrame({'a':[1.23, 2.34, 3.45], 'b':[4.4, 4.5, 4.6]}) # a b # 0 1.23 4.4 # 1 2.34 4.5 # 2 3.45 4.6 def func_ROUND_HALF_UP(list1): return [Decimal(str(i)).quantize(Decimal('1'), rounding=ROUND_HALF_UP) for i in list1] print(df.agg(func_ROUND_HALF_UP)) # a b # 0 1 4 # 1 2 5 # 2 3 5 print(df.round()) # a b # 0 1.0 4.0 # 1 2.0 4.0 ⇒ 偶数丸め # 2 3.0 5.0
pandasのDataFrame(切り上げ)
pandasのDataFrameで切り上げを行う際はDataFrameのagg関数を使い、np.ceil関数を適用します。
print(df.agg(np.ceil)) # a b # 0 2.0 5.0 # 1 3.0 5.0 # 2 4.0 5.0
pandasのDataFrame(切り捨て)
pandasのDataFrameで切り捨てを行う際はDataFrameのagg関数を使い、np.floor関数を適用します。
print(df.agg(np.floor)) # a b # 0 1.0 4.0 # 1 2.0 4.0 # 2 3.0 4.0