Python3の割り算は切り捨てではない


チラ裏なので1分で読めます


図:予想外の挙動を見せる割り箸

いったい何です

(int型)÷(int型)=(?型)

Python2→int型(切り捨て)
Python3→float型(型が変化)

マジか〜〜〜

Python2系での割り算

Python2
>>> 12/5
2
>>> type(12/5)
<type 'int'>

>>> 12.0/5
2.4
>>> type(12.0/5)
<type 'float'>

とまあ,一般的というか、int型同士の除算は小数点以下切り捨てになります。
型もintです。
(どちらか一方でもfloat型だった場合、float型で返ります)

Python3系での割り算

対してPython3でのint型同士の割り算

Python3
>>> 12/5
2.4
>>> type(12/5)
<class 'float'>

>>> 10/5
2.0
>>> type(10/5)
<class 'float'>

割り算の結果は全てfloat型で返ります。
四則演算の挙動が違う、驚愕の仕様でございます。

おまけ

Python3でも/の代わりに//を使用することで、小数点以下切り捨ての除算ができます。

Python3
>>> 12//5
2
>>> type(12//5)
<class 'int'>
Python3
>>> 12.0//5.0
2.0
>>> type(12.0//5.0)
<class 'float'>

以上のように、
//を使用するとfloat型同士の計算でも切り捨ててしまうので、一括で置換する際は注意が必要です。
(型はfloatなのに切り捨ててるので尚のこと注意)

以上、メモでした。


2020-09-16 追記

数年越しに加筆修正してて気付いたのですが、Python3のほうが出力の型が統一されてる上に情報の欠損少なくて良い気がしますね
切り捨てしたいときはresult = int(int_a / int_b)的な感じで割り算全体をint型へキャストしてあげればいいだけですし
執筆時は「勝手に変換すんなよー!」とか思って書いた気がします、青いですね