Pythonで小数を整数にしたいとき…mathモジュールのfloor(切り捨て)・ceil(切り上げ)を使う方法があります。
int()は明示的ですが小数点以下が切り捨てになります。round()は四捨五入になるとは限らない。
切り捨てるか、切り上げるか、明確にできる場合はmathモジュールを使って整数にするのが安全です。
切り捨て | math.floor(), int() |
切り上げ | math.ceil() |
偶数丸め(四捨五入ではない) | round() |
切り捨てと切り上げの書き方
Pythonで小数を整数にするときは、mathモジュールをインポートします。math.floorで切り捨て、math.ceilで切り上げできます。
import math
##切り捨て
math.floor(1 / 2)
# 0
##切り上げ
math.ceil(1 / 2)
# 1
Pythonのmathモジュールを使わずに切り捨て・切り上げをする書き方があります。
##切り捨て
1 // 2
# 0
##切り上げ
-(-1 // 2)
# 1
※この切り上げは、負の整数が切り捨てられることによって負の側に端数処理されることを利用しています。-(-0.5) → -(-1) → 1という理解になります。
int関数は小数点以下を切り捨て
Pythonのint関数は小数を整数にする上で明示的です。ただし、小数点以下が切り捨てになることに注意が必要です。
##切り捨てられる
int(1 / 2)
# 0
round関数は四捨五入ではない!
pythonのround関数は「偶数丸め」と呼ばれる端数処理です。round処理される桁が5の場合は、偶数になるように端数処理します。小数を整数にする目的でround関数を使うと思わぬ挙動になることがあるので注意が必要です。
##切り捨てるように丸められる
round(0.5)
# 0
##切り上げるように丸められる
round(1.5)
# 2
※Pythonのround関数の「丸め」についてはこちらの記事で詳しく説明しております。
切り上げを使った関数の実例
全角と半角が入り混じったテキストの文字数を、全角(Fullwidth)の文字数で返す関数です。
import unicodedata as uni
def len_fullwidth(text):
return -(-sum([(1, 2)[uni.east_asian_width(t) in 'FWA'] for t in text])//2)
##関数を使ってみると...
len_fullwidth('abcあいう')
# 6
※unicodedataモジュールからeast_asian_width関数を使います。east_asian_width関数は、全角英字=’F’、仮名漢字=’W’、それ以外の全角=’A’を返り値にします。返り値を(半角=1文字, 全角=2文字)としてリストし、合計値を2で割って全角の文字数を求めます。半端の半角は全角1文字として数えています。east_asian_width関数についてはこちらの記事で詳しく解説しております。