いろいろ備忘録日記

主に .NET とか Java とか Python絡みのメモを公開しています。

Pythonメモ-103 (round関数の丸め戦略)(python3から変更, 最近接偶数丸め, round ties to even)

概要

知らなかったので忘れないうちにメモメモ。組み込み関数 round() の丸め方が python3 から変更されていたのですね。

docs.python.org

stackoverflow.com

最近接偶数丸めに変更となっています。

ja.wikipedia.org

python2 の環境が今無いので試していませんが、たしか前は普通の四捨五入だったような記憶がします。

なので、頭が四捨五入の状態で round(2.5) の結果を予想すると 3 なのに

Python 3.7.2 (default, Feb 12 2019, 08:16:38) 
Type 'copyright', 'credits' or 'license' for more information
IPython 7.2.0 -- An enhanced Interactive Python. Type '?' for help.

In [1]: round(2.5)                                                                                                                          
Out[1]: 2

って出て焦ります(ました

丸める対象の値が、ど真ん中(tie)の場合に最近接偶数に丸めるという戦略なので、確かに 2 になりますね。

サンプル

"""
組み込み関数 round() のサンプルです.

python3 から round の丸め方について変更されているので、そのサンプルです。

REFERENCERS:: http://bit.ly/2H4CBZT
              http://bit.ly/2H69SUB
              http://bit.ly/2H4CE81
              http://bit.ly/2GZBz12
"""
from trypython.common.commoncls import SampleBase
from trypython.common.commonfunc import pr


class Sample(SampleBase):
    def exec(self):
        # --------------------------------------------------------------------
        # 組み込み関数 round() は、Python3 にて丸め方が変更となっている.
        # Python3 からは
        #   「最近接偶数への丸め」
        #      - round half to even
        #      - round ties to even
        # に変わった。
        #
        # これは、丸め対象の値が tie つまり、ど真ん中の場合に
        # 最も近い偶数の方に丸めるという方式。
        #
        # なので、round(2.5) は、tie であるので、最近接偶数 が適用されて 2 となる。
        # --------------------------------------------------------------------
        pr('round(0.5)', round(0.5))  # 最近接偶数 は 0
        pr('round(1.5)', round(1.5))  # 最近接偶数 は 2
        pr('round(2.5)', round(2.5))  # 最近接偶数 は 2
        pr('round(3.5)', round(3.5))  # 最近接偶数 は 4
        pr('round(1.3)', round(1.3))  # ど真ん中 (tie) ではないので、通常の丸めで 1
        pr('round(1.7)', round(1.7))  # ど真ん中 (tie) ではないので、通常の丸めで 2


def go():
    obj = Sample()
    obj.exec()


if __name__ == '__main__':
    go()

実行すると以下のようになります。

round(0.5)=0
round(1.5)=2
round(2.5)=2
round(3.5)=4
round(1.3)=1
round(1.7)=2

過去の記事については、以下のページからご参照下さい。

  • いろいろ備忘録日記まとめ

devlights.github.io

サンプルコードは、以下の場所で公開しています。

  • いろいろ備忘録日記サンプルソース置き場

github.com

github.com