Pythonのround()関数は、丸め操作を行いたいときに非常に便利です。
多くの場合、長い浮動小数点数の小数を丸めたり減らしたりして、素早く値を推定したいと思うでしょう。
例題とともに、どのように使えるか見ていきましょう!
Python の round() 関数のシンタックス
この関数は非常にシンプルです。
数値を受け取って、丸めた数値を出力します。
round (num, [ndigits])
|
ここでは、 num
を丸める必要があるので、 round()
に渡します。
また、 ndigits
を使用して、丸めの精度を指定することもできます。
これにより、小数点以下の数値は ndigits の精度で丸められることになる。
もし、整数値に丸めたい場合は、この値を指定する必要はない。
この場合,最も近いInteger値が返される。
また、数値が x.5
という形式である場合、切り上げの値が偶数であれば値は切り上げられる。
そうでなければ、切り捨てられます。
例えば、2.5は最も近い偶数であるため2に丸められ、3.5は4に丸められます。
それでは、いくつかの例を見てみましょう。
Python round() の例
検討すべきケースがいくつかあるので、一つずつ進めていきましょう。
1. 整数の丸め
次の例は、整数に丸める方法を示しています。
print ( round ( 5 , 2 )) # Round 5 upto 2 decimal places. But 5 is already an integer!
print ( round ( 6.4 ))
print ( round ( 7.7 ))
print ( round ( 3.5 ))
|
結果は以下の通りです。
5 6 8 4 |
2. 偶数辺への丸め
前述したように、偶辺と奇辺の両方が同じように近い数 (x.5
) である場合、偶辺に丸めることになる。
print ( round ( 10.5 ))
print ( round ( 11.5 ))
|
結果は以下の通りです。
10 12 |
3. ndigit=None での丸め方
引数 ndigit
が指定されていない場合 (または None
の場合)、最も近い整数への丸めが行われる。
print ( round ( 2.5 )) # Rounding will happen to the nearest even number
# OR print ( round ( 2.5 , None ))
|
結果は以下の通りです。
2 2 |
4. ndigit < 0 での丸め方
引数 ndigit
には負の値も渡すことができます。
これは、小数点の左側から丸め始めます。
つまり、元の数値が小数点以下 3 桁である場合、ndigit = -3
を渡すと、小数点以下 3 桁を削除して 0 に置き換えるので、0 となります!
print ( round ( 123.456 , 0 ))
print ( round ( 123.456 , - 1 ))
print ( round ( 123.456 , - 2 ))
print ( round ( 123.456 , - 3 ))
|
結果は以下の通りです。
123 120.0 100.0 0.0 |
浮動小数点数の丸めに関する異変
浮動小数点数はその精度によって定義されるので、Pythonは計算中にこれらの数を近似します。
この近似のため、丸め処理を行うと予期せぬ結果が得られることがあります。
以下のブロックを考えてみてください。
>>> 0.1 + 0.1 = = 0.2
True >>> 0.1 + 0.1 + 0.1 = = 0.3
False >>> 0.1 + 0.1 + 0.1 + 0.1 = = 0.4
True |
さらにいくつかの例を見てみましょう。
>>> print ( round ( 21.575 , 2 ))
21.57 >>> print ( round ( 1.23546 , 2 ))
1.24 >>> print ( round ( - 1.2345 , 2 ))
- 1.23
|
ここでも浮動小数点数の近似のため、正確な出力は得られません。
最初のケースでは、21.58を期待したのですが、21.57
しか得られませんでした。
このため、浮動小数点を扱う場合は常に注意が必要です。
このような出力の小さな変化が、将来的に大きな問題を引き起こす可能性があるからです。
Python の round() をカスタムオブジェクトで使用する
Python の round()
メソッドは内部で __round__()
ダンダメソッドを呼び出します。
カスタムクラスを作成する場合、このメソッドをオーバーライドすることができます。
そのため、私たちのオブジェクトで round()
を呼び出すと、代わりにこのオーバーライドされたメソッドに移動します。
では、独自の丸め器を作ってみましょう。
class MyClass:
def __init__( self , data):
assert type (data) = = type ([])
self .data = data # Assume List type data of numbers
def __round__( self , num_digits = None ):
for idx in range ( len ( self .data)):
self .data[idx] = round ( self .data[idx], num_digits)
return self
my_obj = MyClass([ 12.34 , 12.345 , 10.5 ])
my_obj = round (my_obj)
print (my_obj.data)
|
結果は以下の通りです。
[ 12 , 12 , 10 ]
|
見てわかるように、MyClass
オブジェクトに独自の丸め関数を実装することができました!
この記事もチェック:Pythonのmapメソッドの使い方|ラムダ関数や引数が複数の場合の使い方も解説
まとめ
今回は、Pythonの round()
関数の使い方について、さまざまな例を使って学びました。