【python】少数の切り上げ・切り捨て・四捨五入の実装方法

スポンサーリンク
【python】少数の切り上げ・切り捨て・四捨五入の実装方法 基礎
この記事を読んで分かること
  • 少数の切り上げ・切り捨ての実装方法
  • int型へのキャストした時の挙動
  • 四捨五入の実装方法

 

切り上げ・切り捨ての挙動一覧

切り上げmath.ceil()切り捨てmath.floor()四捨五入Decimalで実装することができます。

切り上げ・切り捨ての挙動
操作 関数 R = 2.2 R = 2.5 R = -2.2 R = -2.5
切り上げ math.ceil(R) 3 3 -2 -2
 切り捨て math.floor(R) 2 2 -3 -3
int(R) 2 2 -2 -2

四捨五入
round(R)
2 2 -2 -2
Decimal
2 3 -2 -3

 

math.ceilの挙動(切り上げ)

標準ライブラリmathのceil関数を使うと切り上げの処理ができます。

小数点以下で切り上げの処理がされます。

import math

R = 1.2
round_up = math.ceil(R)
print(f"元の値:{R} 切り上げ:{round_up}")

R = 1.8
round_up = math.ceil(R)
print(f"元の値:{R} 切り上げ:{round_up}")
元の値:1.2 切り上げ:2
元の値:1.8 切り上げ:2

 

正負のどちらでも1つ大きい整数となります。

R = -3.5
for i in range(8):
    round_up = math.ceil(R + i)
    print(f"元の値:{R + i} 切り上げ:{round_up}")
元の値:-3.5 切り上げ:-3
元の値:-2.5 切り上げ:-2
元の値:-1.5 切り上げ:-1
元の値:-0.5 切り上げ:0
元の値:0.5 切り上げ:1
元の値:1.5 切り上げ:2
元の値:2.5 切り上げ:3
元の値:3.5 切り上げ:4

 

math.floorの挙動(切り捨て)

標準ライブラリmathのfloor関数を使うと切り捨ての処理ができます。

小数点以下で切り捨ての処理がされます。

import math

R = 1.2
round_down = math.floor(R)
print(f"元の値:{R} 切り捨て:{round_down}")

R = 1.8
round_down = math.floor(R)
print(f"元の値:{R} 切り捨て:{round_down}")
元の値:1.2 切り捨て:1
元の値:1.8 切り捨て:1

 

正負のどちらでも1つ小さい整数となります。

R = -3.5
for i in range(8):
    round_down = math.floor(R + i)
    print(f"元の値:{R + i} 切り捨て:{round_down}")
元の値:-3.5 切り捨て:-4
元の値:-2.5 切り捨て:-3
元の値:-1.5 切り捨て:-2
元の値:-0.5 切り捨て:-1
元の値:0.5 切り捨て:0
元の値:1.5 切り捨て:1
元の値:2.5 切り捨て:2
元の値:3.5 切り捨て:3

 

intへのキャストの挙動(切り捨て)

intへキャストすることで切り捨てと同等の処理ができます。

importの必要もなく、小数点以下で切り捨ての処理がされます。

R = 1.2
int_R = int(R)
print(f"元の値:{R} 切り捨て:{int_R}")

R = 1.8
int_R = int(R)
print(f"元の値:{R} 切り捨て:{int_R}")
元の値:1.2 切り捨て:1
元の値:1.8 切り捨て:1

 

intのキャストでは、整数部分がそのまま出力されます。

そのため負の数では、math.floorとは違い1つ大きい整数となります。

R = -3.5
for i in range(8):
    int_R = int(R + i)
    print(f"元の値:{R + i} 切り捨て:{int_R}")
元の値:-3.5 切り捨て:-3
元の値:-2.5 切り捨て:-2
元の値:-1.5 切り捨て:-1
元の値:-0.5 切り捨て:0
元の値:0.5 切り捨て:0
元の値:1.5 切り捨て:1
元の値:2.5 切り捨て:2
元の値:3.5 切り捨て:3

 

roundの挙動(偶数丸めの四捨五入)

組み込み関数であるround関数を使うと四捨五入の処理ができます。

R = 1.2
round_R = round(R)
print(f"元の値:{R} 四捨五入:{round_R}")

R = 1.8
round_R = round(R)
print(f"元の値:{R} 四捨五入:{round_R}")
元の値:1.2 四捨五入:1
元の値:1.8 四捨五入:2

 

ただ、round関数は一般的な四捨五入ではなく偶数丸めとなります。

xx.5のときには偶数になるように切り上げ・切り捨てが行われます。

R = -3.5
for i in range(8):
    round_R = round(R + i)
    print(f"元の値:{R + i} 四捨五入:{round_R}")
元の値:-3.5 四捨五入:-4
元の値:-2.5 四捨五入:-2
元の値:-1.5 四捨五入:-2
元の値:-0.5 四捨五入:0
元の値:0.5 四捨五入:0
元の値:1.5 四捨五入:2
元の値:2.5 四捨五入:2
元の値:3.5 四捨五入:4

 

また、round関数は第2引数を指定することで、四捨五入する桁を選択できます。

0を指定すると少数第1位で四捨五入をし、1,2,・・・を指定すると少数第2,3,・・・位を四捨五入します。

負の値-1,-2,・・・を指定すると、1,10,・・・の位で四捨五入します。

R = 123.456
print(f"元の値:{R} 四捨五入:{round(R, -3)}")
print(f"元の値:{R} 四捨五入:{round(R, -2)}")
print(f"元の値:{R} 四捨五入:{round(R, -1)}")
print(f"元の値:{R} 四捨五入:{round(R, 0)}")
print(f"元の値:{R} 四捨五入:{round(R, 1)}")
print(f"元の値:{R} 四捨五入:{round(R, 2)}")
print(f"元の値:{R} 四捨五入:{round(R, 3)}")
元の値:123.456 四捨五入:0.0
元の値:123.456 四捨五入:100.0
元の値:123.456 四捨五入:120.0
元の値:123.456 四捨五入:123.0
元の値:123.456 四捨五入:123.5
元の値:123.456 四捨五入:123.46
元の値:123.456 四捨五入:123.456

 

Decimalの挙動(一般的な四捨五入)

標準ライブラリdecimalを使うと四捨五入の処理ができます。

from decimal import Decimal, ROUND_HALF_UP

R = 1.2
rounding_off = Decimal(str(R)).quantize(Decimal("0"), rounding=ROUND_HALF_UP)
print(f"元の値:{R} 四捨五入:{rounding_off}")

R = 1.8
rounding_off = Decimal(str(R)).quantize(Decimal("0"), rounding=ROUND_HALF_UP)
print(f"元の値:{R} 四捨五入:{rounding_off}")
元の値:1.2 四捨五入:1
元の値:1.8 四捨五入:2

 

decimalを使うと一般的な四捨五入(4以下は切り捨て、5以上は切り上げ)を実装することができます。

R = -3.5
for i in range(8):
    rounding_off = Decimal(str(R + i)).quantize(
        Decimal("0"), rounding=ROUND_HALF_UP
    )
    print(f"元の値:{R + i} 四捨五入:{rounding_off}")
元の値:-3.5 四捨五入:-4
元の値:-2.5 四捨五入:-3
元の値:-1.5 四捨五入:-2
元の値:-0.5 四捨五入:-1
元の値:0.5 四捨五入:1
元の値:1.5 四捨五入:2
元の値:2.5 四捨五入:3
元の値:3.5 四捨五入:4

 

また、少数第何位で四捨五入するかも指定することができます。

ただ、整数部分を指定することはできません

R = 123.456

rounding_off = Decimal(str(R)).quantize(
        Decimal("0"), rounding=ROUND_HALF_UP
    )
print(f"元の値:{R} 四捨五入:{rounding_off}")

rounding_off = Decimal(str(R)).quantize(
        Decimal("0.1"), rounding=ROUND_HALF_UP
    )
print(f"元の値:{R} 四捨五入:{rounding_off}")

rounding_off = Decimal(str(R)).quantize(
        Decimal("0.01"), rounding=ROUND_HALF_UP
    )
print(f"元の値:{R} 四捨五入:{rounding_off}")
元の値:123.456 四捨五入:123
元の値:123.456 四捨五入:123.5
元の値:123.456 四捨五入:123.46
元の値:123.456 四捨五入:123.456

 

 

参考文献

math --- 数学関数
このモジュールは、 C 標準で定義された数学関数へのアクセスを提供します。 これらの関数で複素数を使うことはできません。複素数に対応する必要があるならば、 cmath モジュールにある同じ名前の関数を使ってください。ほとんどのユーザーは複素数を理解するのに必要なだけの数学を勉強したくないので、複素数に対応した関数と対応...
Pythonで小数・整数を四捨五入するroundとDecimal.quantize | note.nkmk.me
Pythonで数値(浮動小数点数floatや整数int)を四捨五入や偶数への丸めで丸める方法について説明する。 組み込み関数round()は一般的な四捨五入ではなく偶数への丸めなので注意。一般的な四捨五入を実現するには標準 ...

コメント

タイトルとURLをコピーしました