python における小数点の処理の仕方について見ていきます。
前回はA事業に所属するチームの平均売上高を算出しました。
参照 → 売上データを集計する方法 – 辞書型 / for 構文
何のことわりもなく、四捨五入をして少数第1位まで表示させましたが、業績評価においては「四捨五入・切り捨て・切上げ」のルール通りに報告する必要があります。
前回において、平均点の計算式は
ave_v = round (Asum/len(salesA),1) となっておりましたが、
Asum / len (salesA) の答えを、「766666.66666」に読み替えて説明していきます。
#四捨五入をする場合・・①
ave_v = round ( 766666.66666)
print(ave_v)
>>> 766667
#小数点以下を切り捨てる場合・・②
import math
ave_v= math.floor(766666.66666)
print(ave_v)
>>> 766666
#小数点以下を切り上げる場合・・③
import math
ave_v= math.ceil(766666.66666)
print(ave_v)
>>> 766667
① 小数点以下を四捨五入をする
小数点以下を四捨五入するには「round ( ) 」を利用します。
カッコ( ) の中に入れる値を「引数」といいます。
引数を複数入力できる場合は、左から第1数、第2引数と数えます。
round( ) の()の中の第1引数は対象となる値ですが、第2引数は丸めて表示する位を指定します。
第2引数を指定しない場合は小数点第1位を四捨五入して整数になります。
ave_v = round ( 766666.66666)
print(ave_v)
>>> 766667
round( 対象値 , 丸めて表示する位)
第2引数に「1」を指定した場合には、四捨五入をして少数点第1位まで表示します。
(小数点以下第2位を四捨五入して第1位まで表示する)
ave_v = round ( 766666.66666,1)
print(ave_v)
>>> 766666.7
第2引数に「-1」を指定した場合には、四捨五入をして整数1の位が「0」になります。
(整数の1の位を四捨五入する)
ave_v = round ( 766666.66666,-1)
print(ave_v)
>>> 766670.0
②小数点以下を切り捨てる
Pythonで切り捨てにするには、Python付属のmathモジュールの「floor」を使います。
「import math」と記述して、mathモジュールをインポートします。
import math
ave_v= math.floor(766666.66666)
print(ave_v)
>>> 766666
③小数点以下を切り上げる
Pythonで切り上げにするには、Python付属のmathモジュールの「ceil」を使います。
「import math」と記述して、mathモジュールをインポートします。
(すでにインポートされている場合は不要)
import math
ave_v= math.ceil(766666.66666)
print(ave_v)
>>> 766667
#期待値1.3 ×
ave_v = round (1.25,1)
print(ave_v)
>>>1.2
#期待値1.4 〇
ave_v = round (1.35,1)
print(ave_v)
>>>1.4
#期待値1.5 ×
ave_v = round (1.45,1)
print(ave_v)
>>>1.4
#期待値1.6 〇
ave_v = round (1.55,1)
print(ave_v)
>>>1.6
#期待値1.7 ×
ave_v = round (1.65,1)
print(ave_v)
>>>1.6
#期待値1.8 〇
ave_v = round (1.75,1)
print(ave_v)
>>>1.8
#期待値1.9 〇
ave_v = round (1.85,1)
print(ave_v)
>>>1.9
#期待値2.0 ×
ave_v = round (1.95,1)
print(ave_v)
>>>1.9
round( ) で「5」を丸める場合は注意が必要です。
上記のように例をあげてみました。
# 期待する値 〇(表示の値が同じ場合) ×(表示の値が異なる場合)
#期待値1.3 ×
ave_v = round (1.25,1)
print(ave_v)
>>>1.2
「1.25」の値について、少数点2位を四捨五入して小数点1位で表示させています。
期待する値は「1.3」になるはずですが、表示される値は「1.2」となります。
原因は ,次の公式ページにもあるように、小数を浮動小数点数で正確に表せないことが原因 のようです。
組み込み関数round()
そこで、小数点数を正しく十進数で計算するにはdecimalモジュールを使用する必要があります。