sec01 - round関数

round関数

"round()"関数は、丸カッコの中で指定した数値を四捨五入する関数です。

(丁度".5"の数値で、皆さんの感覚と違う結果が出てきますので、この関数を使う時はその違いを許容できるかどうかを確認してください。)

それでは早速、コードを実行して挙動を確認してみましょう。

# 1.0, 1.49, 1.5, 1.51
result_1_00 = round(1.0)
result_1_49 = round(1.49)
result_1_50 = round(1.5)
result_1_51 = round(1.51)
print('round(1.00):', result_1_00)
print('round(1.49):', result_1_49)
print('round(1.50):', result_1_50)
print('round(1.51):', result_1_51)

結果は下図のようになったかと思います。これは、皆さんと同じ感覚で四捨五入されたかと思います。"round(1.5)"は"2"を返します。

それでは、次のコードを実行してみましょう。

# 2.0, 2.49, 2.5, 2.51
result_2_00 = round(2.0)
result_2_49 = round(2.49)
result_2_50 = round(2.5)
result_2_51 = round(2.51)
print('round(2.00):', result_2_00)
print('round(2.49):', result_2_49)
print('round(2.50):', result_2_50)
print('round(2.51):', result_2_51)

結果は下図のようになったかと思います。"round(2.5)"の結果が、皆さんの感覚と違って"3"ではなく"2"を返します。なぜこのような挙動になるのか、次の項目で説明します。

偶数丸め

Pythonのround関数では、"偶数丸め"を採用しています。偶数丸めは、次の特徴があります。

  • 端数が0.5より小さいなら"切り捨て"
  • 端数が0.5より大きいならば"切り上げ"
  • 端数がちょうど0.5なら、切り捨てと切り上げのうち結果が偶数となる方へ丸める

つまり、丁度".5"の場合に偶数の方へ丸められた結果が返ってくるのが、皆さんの感覚と違うところになります。図で表すと次のようになります。

".5"より少しでも大きな".500001"のような数値であれば"切り上げ"られますし、少しでも小さな".4999999"は"切り捨て"られます。

この方式は、通常の四捨五入より偏りが少ないというメリットがあります。そのため、このような"round"の挙動を採用しているプログラミング言語はPython以外にもあります。全ての言語で採用されているわけではないので、各言語の仕様は必ずご確認ください。

※ Python2は、丁度".5"の場合は切り上げが行われます。Python3とは挙動が違いますので注意が必要です。

小数点第1位以外の四捨五入の場合

小数点第1位を四捨五入して整数にする場合、丁度".5"の場合に偶数への丸めが行われました。言い換えると、『四捨五入する桁の数値が"5"であり、それ以下にゼロが続く場合に偶数丸めが行われる』ということになります。

これは、小数点第2位以下の場合や、整数部の10の位、100の位...を四捨五入する場合も考え方は同じです。

例えば"500.0"の100の位を四捨五入する場合、100の位が"5"であり、それ以下にゼロが続く("00.0")ので、偶数への丸めが行われて結果は"0.0"になります。"500.0001"のように"500.0"より少しでも大きな数値であれば切り上げられて"1000.0"になります。

桁の指定

"round()"関数は、四捨五入する桁を指定することができます。

"round()"の丸カッコの中をカンマ(,)で区切り、四捨五入したい数値と桁数をそれぞれ指定します。次のようにコードを書きます。

result0 = round(123.456, 0)
result1 = round(123.456, 1)
result2 = round(123.456, 2)
print('ndigits 0:', result0)
print('ndigits 1:', result1)
print('ndigits 2:', result2)

上記コードでは、"123.456"を桁指定して四捨五入を行っています。

1行目は、"round(123.456, 0)"と、桁指定を"0"にしています。この場合は小数点第1位を四捨五入して"123.0"を返します。桁指定が"0"の場合は桁指定しない場合("round(123.456)")と同じ挙動になります。

2行目と3行目についてですが、桁指定の数値を1つずつ上げていく毎に、"1"の時は小数点第2位、 "2"の時は小数点第3位のように、順に小数点以下の桁数を指定することができます。上記コードを実行した結果は、それぞれ"123.5"(小数点第2位を四捨五入), "123.46"(小数点第3位を四捨五入)の結果が返ってきます。

桁指定の上限は設けられていないので、"3"以上の桁指定も可能です。

元数値が持っている小数部の桁数以上の値を指定した場合

元数値が持っている小数部の桁数以上の値を指定した場合は、元数値がそのまま返ってきます。

例えば、"round(123.456, 3)"の場合、"123.4560"の小数点第4位を四捨五入しようとするのと同義であり、小数点第4位の"0"を四捨五入しても切り捨てにしかならないため、結果として"123.456"が返ります。

次に、桁指定をマイナスの値で行ってみましょう。

result_1 = round(123.456, -1)
result_2 = round(123.456, -2)
print('ndigits -1:', result_1)
print('ndigits -2:', result_2)

このコードを実行すると、"120.0", "100.0"が返ってきます。マイナスの値で桁数を指定すると、"-1"は整数部の1の位を、"-2"は10の位のように、順に四捨五入する整数部の桁数が上がっていきます。

整数部に対する桁数についても、上限は設けられていません。

整数部の桁数を超えた指定をした場合

元数値の整数部の桁数を超えた指定をした場合は"0.0"が返ってきます。

例えば、"round(123.456, -4)"の場合、"0123.456"の1000の位を四捨五入しようとするのと同義であり、1000の位の"0"を四捨五入しても切り捨てになるため、結果として"0.0"が返ります。

おすすめの記事