ブルーの趣味Log

日々の備忘録

python3の四捨五入について

※非常に有名な話だそうですが、今日まで知りませんでした・・・。

Python2とPython3

pythonには2系と3系があります。
2から3にバージョンアップする際に、いろいろと仕様が変わってしまったため、独立したバージョンとして扱われるようになったと記憶しています(たぶん)。

昔はサードパーティ製のライブラリが3に対応できていないから2を使うなんてことよくありましたが、最近はほぼ3に対応できているので、今から勉強する人は3で問題ないです。

で、この2と3ですが、結構違います。有名なところだと、整数同士の割り算の扱いや、print、range関数ですかね。

ネット上によくまとめられているサイトがありました。
qiita.com
(こんなに変更点あったんだ!)

pythonの四捨五入について

さて本題です。四捨五入。
ご存知4以下は切り捨て、5以上は切り上げるというヤツです。
この四捨五入、python2系ではroundという関数で実装されていました。

>>> round(2.4)
2.0
>>> round(2.5)
3.0
>>> round(3.4)
3.0
>>> round(3.5)
4.0

当然の結果です。なんの驚きもありません。
で、問題のpython3系でのround関数です。

>>> round(2.4)
2
>>> round(2.5)
2
>>> round(3.4)
3
>>> round(3.5)
4

衝撃の挙動。
最初に見た時は戸惑いました。
round(2.4)が2なのは当然として、round(2.5)が2で、それでいてround(3.5)は4なのです。

どうやら、丸め込み先の桁の数が偶数の場合は切り捨て、
奇数の場合は切り上げるようです。理由はそのほうが誤差が小さくなるからだそうです。

調べると山ほどはまった人の情報が出てきます(笑)どうして今まで知らなかったのだろう?

ちなみに今までどおりの普通の四捨五入の結果を得るには、自分で実装するしかないそうです。
qiita.com