Pythonのround関数の使い方を解説していく

スポンサーリンク

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の round() 関数の使い方について、さまざまな例を使って学びました。

タイトルとURLをコピーしました