【Python】整数や小数の四捨五入や切り捨て切り上げを行う
Pythonの場合、四捨五入に近いことはround()を使うことでできる。
整数部分に関しては四捨五入が可能となるが、小数部分に関しては、完全に四捨五入するのは難しい。
小数は基本的に2**-1、2**-2、2**-3・・・といった2進数の合計で表されるため、全ての小数を厳密に表しているわけではないことが原因。
また、用途によってはintで整数部分のみを取り出したり、ceil、floorで小数部分を切り上げ、切り捨てなどもある。
round関数での四捨五入
round(num, n)
で10の-n乗の位に丸めた数値を返す。
戻り値はnumと同じ型が戻る。nを省略した場合はintが戻る。
四捨五入と書いたが、四捨五入できるのは整数部分を四捨五入した場合のみ。
つまりnに負数を指定した場合のみである。
整数部分の四捨五入
round(num, n)
でnに負数を指定することで10の位以上の部分で四捨五入できる。
1# 10**1の位(10の位)で丸める
2# intを丸めるとintが返る。
3round(15, -1)
4# 20
5
6# 10**1の位(10の位)で丸める
7# floatを丸めるとfloatが返る
8round(15., -1)
9# 20.0
10
11# 10**2の位(100の位)で丸める
12round(15, -2)
13# 0
14
15round(14.9, -1)
16# 10.0
17
18round(-15, -1)
19# -20
20
21round(-14, -1)
22# -10
小数部分の四捨五入
厳密な四捨五入とはならないため、それを踏まえて処理を行う必要がある。
小数点第1位を丸める
小数点第1位の丸めは、四捨五入ではないが、割と分かりやすい動作かもしれない。
0.5などの.5の部分を丸める場合、偶数に近い方に丸められる。
1# 0.5を丸めると最も近い偶数である0になる
2round(0.5, 0)
3# 0.0
4
5# 負数を丸める場合も、偶数に近い方に丸められる
6round(-0.5, 0)
7# -0.0
8
9# 偶数に近い方に丸められる
10round(1.5, 0)
11# 2.0
12round(2.5, 0)
13# 2.0
14round(-1.5, 0)
15# -2.0
16round(-2.5, 0)
17# -2.0
小数点第2位以下を丸める
厳密な四捨五入は不可能。
Pythonを始めとしたプログラミング言語では基本的に2の-n乗の数値を加算することで、小数を近似的に表している。
つまり、0.5(1/2)や0.25(1/4)、0.125(1/8)などの数値の足し算で近似している。
有名な例としては0.1を正確に表すことはできない。
1# 四捨五入と同じ動作
2round(0.115, 2)
3# 0.12
4
5# 必ずしも四捨五入と同じ動作になるとは限らない
6round(2.675, 2)
7# 2.67
上記のとおり、2.675の小数点第3位を丸めても2.68にならない。
intで整数部分を取り出す
四捨五入でなく、整数部分が欲しいだけの場合、int()
を使うのが楽。
1int(3.5)
2# 3
3
4int(3.9)
5# 3
ceilで小数点以下を切り上げる
math.ceil(x)
を使うとxの小数点以下の部分を切り上げて整数にすることができる。
xが負数の場合を考えると、切り上げると言うのは正確ではない。
正確には、x以上の数で最小の整数を返す。
1import math
2
3# 3.1よりも大きい最小の整数なので、4が返る
4math.ceil(3.1)
5# 4
6
7# -3.1よりも大きい最小の整数なので、-3が返る
8math.ceil(-3.1)
9# -3
floorで小数点以下を切り捨てる
math.floor(x)でxの小数点以下の部分を切り捨てて整数にすることができる。
ceilと同じく、xが負数の場合は切り捨てにはならない。
正確には、x以下の数で最大の整数を返す。
1import math
2
3# 3.1以下で最大の整数を返す
4math.floor(3.1)
5# 3
6
7# -3.1以下で最大の整数を返す
8math.floor(-3.1)
9# -4
まとめ
整数部分の四捨五入はround()で可能。
それ以外は用途や目的に応じて適切なものを選ぶしかない。
1# 10**1の位(10の位)で丸める
2# intを丸めるとintが返る。
3round(15, -1)
4# 20
5
6round(14.9, -1)
7# 10.0
8
9round(-15, -1)
10# -20
11
12round(-14, -1)
13# -10
14
15# 0.5を丸めると最も近い偶数である0になる
16round(0.5, 0)
17# 0.0
18
19# 負数を丸める場合も、偶数に近い方に丸められる
20round(-0.5, 0)
21# -0.0
22
23# 四捨五入と同じ動作
24round(0.115, 2)
25# 0.12
26
27# 必ずしも四捨五入と同じ動作になるとは限らない
28round(2.675, 2)
29# 2.67
30
31# 整数部分の取り出し
32int(3.5)
33# 3
34
35# 3.1以上の最小の整数を返す
36math.ceil(3.1)
37# 4
38
39# -3.1以上の最小の整数を返す
40math.ceil(-3.1)
41# -3
42
43# 3.1以下で最大の整数を返す
44math.floor(3.1)
45# 3
46
47# -3.1以下で最大の整数を返す
48math.floor(-3.1)
49# -4
個人的には、roundは、色々な計算をする関数のテストで答え合わせをする際に、適当な桁数で丸めたい時に使うことが多い。