タイトル: 数値を扱う組み込み関数(int / float / abs / round / min / max / sum / divmod など)
SEOタイトル: Python 数値系組み込み関数まとめ(int / round / divmod / pow / Decimal / Fraction まで)
| この記事の要点 |
|
型変換系
# int(): 整数化
int('42') # 42
int('1010', 2) # 10 — 2 進数として解釈
int('ff', 16) # 255 — 16 進数
int(3.7) # 3 — 切り捨て(負方向ではなく 0 方向)
int(-3.7) # -3 — 同じく 0 方向
# float(): 浮動小数化
float('3.14') # 3.14
float('1e3') # 1000.0
float('inf') # inf
float('nan') # nan
# complex(): 複素数
complex(2, 3) # (2+3j)
complex('1+2j') # (1+2j)
絶対値・丸め
abs(-5) # 5
abs(-3.14) # 3.14
abs(3 + 4j) # 5.0 — 複素数の絶対値
# round()
round(3.7) # 4
round(3.5) # 4 — 偶数丸め(銀行家丸め)!
round(2.5) # 2 — 同じく偶数側
round(3.14159, 2) # 3.14 — 小数点以下 2 桁
round(1234, -2) # 1200 — 100 の位で丸め
# 切り捨て / 切り上げ
import math
math.floor(3.7) # 3
math.ceil(3.2) # 4
math.trunc(3.7) # 3 — 0 方向(int() と同じ)
round() の罠(偶数丸め)
Python 3 の round() は銀行家丸め(Banker's rounding)。0.5 のとき偶数側に丸めるため、慣れた四捨五入と結果が違うことがあります:
round(0.5) # 0 — ★期待: 1
round(1.5) # 2
round(2.5) # 2 — ★期待: 3
round(3.5) # 4
# 教科書通りの四捨五入が欲しい場合
import math
def round_half_up(x, ndigits=0):
p = 10 ** ndigits
return math.floor(x * p + 0.5) / p
round_half_up(0.5) # 1
round_half_up(2.5) # 3
# または Decimal で
from decimal import Decimal, ROUND_HALF_UP
Decimal('2.5').quantize(Decimal('1'), rounding=ROUND_HALF_UP)
# Decimal('3')
累乗と商・剰余
# pow(): 累乗
pow(2, 10) # 1024
2 ** 10 # 1024 — 演算子も同じ
pow(2, 10, 1000) # 24 — (2 ** 10) % 1000 ★モジュロ高速
# divmod(): 商と剰余を同時に
divmod(17, 5) # (3, 2)
# 内訳: 17 // 5 == 3, 17 % 5 == 2
q, r = divmod(100, 7)
print(q, r) # 14 2
# 時刻計算で便利
secs = 12345
h, rem = divmod(secs, 3600)
m, s = divmod(rem, 60)
print(f'{h}h {m}m {s}s') # 3h 25m 45s
集約: min / max / sum
sum([1, 2, 3, 4]) # 10
sum([1, 2, 3], 100) # 106 — 初期値指定
min(3, 1, 4, 1, 5) # 1
max([3, 1, 4, 1, 5]) # 5
# key 関数指定
words = ['apple', 'banana', 'kiwi']
min(words, key=len) # 'kiwi' — 長さ最小
max(words, key=len) # 'banana' — 長さ最大
# default 指定(空でもエラー出さない)
min([], default=0) # 0
# min([]) # ValueError
# 浮動小数の総和は誤差に注意 → math.fsum
import math
sum([0.1] * 10) # 0.9999999999999999
math.fsum([0.1] * 10) # 1.0 — 高精度
進数変換
bin(10) # '0b1010'
oct(10) # '0o12'
hex(255) # '0xff'
# プレフィックス除去
bin(10)[2:] # '1010'
f'{10:b}' # '1010' — f-string
f'{10:08b}' # '00001010' — 0 埋め 8 桁
f'{255:x}' # 'ff'
f'{255:X}' # 'FF' — 大文字
# 文字列 → 整数(任意の基数)
int('1010', 2) # 10
int('ff', 16) # 255
int('0b1010', 0) # 10 — プレフィックスから自動判定
正確な計算: Decimal と Fraction
金融計算など誤差を許容できない場面では float ではなく Decimal を使います:
# float は 2 進数なので 10 進小数を正確に表せない
0.1 + 0.2 # 0.30000000000000004
from decimal import Decimal, getcontext
Decimal('0.1') + Decimal('0.2') # Decimal('0.3') — 正確
# 丸め
getcontext().prec = 10
Decimal(1) / Decimal(3)
# Decimal('0.3333333333')
# 分数
from fractions import Fraction
Fraction(1, 3) + Fraction(1, 6)
# Fraction(1, 2)
Fraction('0.1') + Fraction('0.2')
# Fraction(3, 10) — 0.3 そのもの
数値系関数一覧表
| 関数 | 用途 | 備考 |
|---|---|---|
int(x[, base]) | 整数化 | 0 方向に切り捨て |
float(x) | 浮動小数化 | 'inf' / 'nan' 可 |
complex(r, i) | 複素数 | |
abs(x) | 絶対値 | 複素数なら大きさ |
round(x, n) | 丸め | ★偶数丸め |
pow(x, y[, m]) | 累乗 | 第 3 引数で剰余 |
divmod(a, b) | (商, 余り) | |
min/max | 最小/最大 | key, default 指定可 |
sum | 総和 | 初期値指定可 |
bin/oct/hex | 進数変換 | 文字列を返す |
FAQ
Q: round の偶数丸めを四捨五入に変えたい
A: math.floor(x + 0.5) または Decimal.quantize(rounding=ROUND_HALF_UP)。
Q: int() で小数点付き文字列がエラー
A: int("3.14") は ValueError。int(float("3.14")) と 2 段階で。
Q: 浮動小数の合計に誤差が出る
A: math.fsum() で誤差を最小化、または Decimal。金額計算では絶対 Decimal を。