Python

【Python】整数や小数の四捨五入や切り捨て切り上げを行う

MAX

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は、色々な計算をする関数のテストで答え合わせをする際に、適当な桁数で丸めたい時に使うことが多い。

スポンサーリンク
ABOUT ME
MAX
MAX
ITエンジニア、データサイエンティスト
新卒でSIerに入社し、フリーランスになってWEB系へ転向。
その後AIの世界へ足を踏み入れ、正社員に戻る。 テーブルデータの分析がメイン。
スポンサーリンク
記事URLをコピーしました