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))
|
結果は以下の通りです。
5684 |
2. 偶数辺への丸め
前述したように、偶辺と奇辺の両方が同じように近い数 (x.5) である場合、偶辺に丸めることになる。
print(round(10.5))
print(round(11.5))
|
結果は以下の通りです。
1012 |
3. ndigit=None での丸め方
引数 ndigit が指定されていない場合 (または None の場合)、最も近い整数への丸めが行われる。
print(round(2.5)) # Rounding will happen to the nearest even number
# ORprint(round(2.5, None))
|
結果は以下の通りです。
22 |
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))
|
結果は以下の通りです。
123120.0100.00.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() 関数の使い方について、さまざまな例を使って学びました。