プログラムで数を扱うとき、整数(int)と小数(float)は見た目が似ていても計算の性質が異なります。
本記事では、Pythonにおけるintとfloatの基本、四則演算、混在計算や型変換、浮動小数点の誤差対策までを段階的に解説します。
初心者の方でも安心して読み進められるよう、サンプルコードと出力を併記します。
Pythonの整数(int)と小数(float)の基礎
intとfloatの違いと使い分け
int(整数)の特徴
intは小数点を持たない数です。
Pythonのint
は任意精度なので、メモリが許す限り非常に大きな整数まで扱えます。
数え上げやインデックス、個数の計算など離散的な数量に使います。
float(小数)の特徴
floatは実数を近似表現するための数で、64ビットの倍精度(IEEE 754)を採用しています。
測定値や割合、平均など連続量に使います。
内部表現の都合で0.1や0.2といった一部の小数は正確に表せません。
使い分けの指針
- 個数や回数、インデックスは
int
。 - 実数計算や割合、平均は
float
。 - 金額など誤差が許されない用途は
Decimal
を検討します(後述)。
次のスニペットで型の違いを確認できます。
# 整数と小数の型を確認する例
a = 42 # int
b = 3.14 # float
print(a, type(a))
print(b, type(b))
42 <class 'int'>
3.14 <class 'float'>
計算で使う数値リテラルの書き方
整数リテラルの基本
整数は通常の数字で表します。
大きな数は_
(アンダースコア)で桁区切りができます。
2進数0b
、8進数0o
、16進数0x
も扱えます。
n1 = 1000000
n2 = 1_000_000 # 桁区切り(可読性向上)
n_bin = 0b1010 # 2進数(10)
n_oct = 0o12 # 8進数(10)
n_hex = 0xA # 16進数(10)
print(n1 == n2, n_bin, n_oct, n_hex)
True 10 10 10
小数リテラルと指数表記
小数は3.0
のように書きます。
指数表記1.23e3
は1230.0
を意味します。
x = 0.5
y = 1.23e3 # 1.23 × 10^3 = 1230.0
z = 4e-2 # 4 × 10^-2 = 0.04
print(x, y, z, type(y))
0.5 1230.0 0.04 <class 'float'>
演算の優先順位と括弧の使い方
演算は優先順位に従って評価されます。
迷ったら括弧で意図を明確にします。
主な演算子の優先順位(高→低)は次の通りです。
演算子 | 説明 |
---|---|
** | 累乗 |
+x , -x | 符号 |
* , / , // , % | 乗除、床除算、剰余 |
+ , - | 加減 |
# 優先順位の例
expr1 = 1 + 2 * 3 ** 2 # ** が最優先、次に *、最後に +
expr2 = (1 + 2) * (3 ** 2) # 括弧で明示
print(expr1, expr2)
19 27
Pythonの四則演算と基本の演算子
足し算と引き算(+と-)
基本の例
a = 10
b = 3
c = 2.5
print(a + b) # 13
print(a - b) # 7
print(a + c) # int と float の混在 → float
13
7
12.5
符号の扱い
print(-5 + 2) # -3
print(5 + -2) # 3
-3
3
掛け算(*)と累乗(**)
掛け算の基本
print(6 * 7) # 42
print(2 * 0.5) # 1.0 (floatを含むのでfloat)
42
1.0
累乗の例
print(2 ** 3) # 8
print(9 ** 0.5) # 平方根(3.0)
8
3.0
割り算(/)の結果はfloatになる
Pythonの/
は常にfloatを返します(整数同士でも結果はfloat)。
print(7 / 2, type(7 / 2)) # 3.5, float
print(8 / 4, type(8 / 4)) # 2.0, float
3.5 <class 'float'>
2.0 <class 'float'>
整数割り算を切り捨てたい場合は//
(床除算)を使います。
負数では0方向ではなく負の無限大方向に切り下げる点に注意します。
print(7 // 2) # 3 (切り捨て)
print(-7 // 2) # -4 (負の無限大方向に床)
print(int(7 / 2)) # 3 (小数をintに変換 → 0方向に切り捨てではないので注意: 実際は小数点以下切り捨て)
3
-4
3
補足: int(x)
は小数点以下を切り捨て(0方向)ます。
-3.5
は-3
になりますが、-7 // 2
は-4
です。
余りを求める(%)
%
は剰余を返します。
符号の規則はa == (a // b) * b + (a % b)
を満たすように定義されます。
print(7 % 3) # 1
print(-7 % 3) # 2 (3 * -3 + 2 = -7)
print(7 % -3) # -2 (-3 * -3 + -2 = 7)
1
2
-2
演算子の組み合わせと優先順位
複数の演算子を混ぜるときは優先順位と左結合(一部を除く)に従います。
意図を明確にするため、括弧でグループ化しましょう。
print(1 + 2 * 3 - 4 / 2) # 1 + 6 - 2 = 5.0
print((1 + 2) * (3 - 4) / 2) # 3 * -1 / 2 = -1.5
print(2 ** 3 ** 2) # 2 ** (3 ** 2) = 512 (** は右結合)
5.0
-1.5
512
intとfloatの混在計算と型変換
混在計算の結果型はfloatになる
intとfloatを一緒に計算すると結果はfloatになります。
これは情報を失わないための自動型変換です。
x = 10
y = 3.0
z = x + y
print(z, type(z))
13.0 <class 'float'>
明示的な型変換(floatとint)
型をはっきり揃えたいときは明示的に変換します。
a = 7
b = 2
print(float(a) / b) # 3.5 明示的にfloat化
print(int(3.9)) # 3 小数点以下切り捨て(0方向)
print(float("2.5")) # 2.5 文字列 → float
3.5
3
2.5
小数点以下を切り捨てるときの注意点
切り捨てには複数の方法があり、負数の扱いが異なるため注意が必要です。
import math
print(int(3.9), int(-3.9)) # 3, -3 (0方向に切り捨て)
print(math.floor(3.9), math.floor(-3.9)) # 3, -4 (床: 負の無限大方向)
print(7 // 2, -7 // 2) # 3, -4 (床除算)
3 -3
3 -4
3 -4
状況に応じてint
、math.floor
、//
を使い分けると安全です。
入力値の型を確認する(type)
デバッグ時はtype
で型を確認します。
混在計算や型変換の結果が意図通りかを確かめましょう。
value = 10 / 4
print(value, type(value))
print(isinstance(value, float)) # True かどうか
2.5 <class 'float'>
True
- 関連記事:文字列と数値の型を変換したい
floatの誤差と丸めの実践
浮動小数点の誤差を知る
0.1や0.2は二進数で有限桁にならないため、内部表現にわずかな誤差が出ます。
そのため0.1 + 0.2 は 0.3 と厳密には等しくありません。
x = 0.1 + 0.2
print(x)
print(x == 0.3)
0.30000000000000004
False
比較が必要なときは、abs(a - b) < 許容誤差
のように許容範囲で判断します。
a = 0.1 + 0.2
b = 0.3
eps = 1e-9
print(abs(a - b) < eps) # 許容誤差内ならTrue
True
roundで桁数を指定して丸める
round(x, ndigits)
で丸められます。
Pythonのround
は銀行丸め(偶数丸め)です。
print(round(1.2345, 2)) # 1.23
print(round(2.675, 2)) # 2.67 (2.68ではない → 代表例)
print(round(2.5), round(3.5)) # 2, 4 (偶数丸め)
1.23
2.67
2 4
表示だけ整えたいなら内部値を変えずにフォーマットする方法もあります(後述)。
Decimalを使った正確な小数計算
金額など誤差が許されない場合はdecimal.Decimal
を使います。
文字列から生成すると安全です。
from decimal import Decimal, ROUND_HALF_UP
price = Decimal("0.1") + Decimal("0.2")
print(price) # 0.3 (正確)
# 2桁に四捨五入(一般的な四捨五入)
x = Decimal("2.675")
y = x.quantize(Decimal("0.01"), rounding=ROUND_HALF_UP)
print(y) # 2.68
0.3
2.68
注意: Decimal(0.1)
のようにfloatから直接作ると誤差を持ち込みます。
必ず"0.1"
のような文字列を使いましょう。
表示フォーマットで桁を整える(format)
表示の体裁だけ整えるならformat
やf-string
を使います。
内部の値は変えずに見た目だけ整うので、集計前の丸めとは区別します。
value = 1234.56789
# 小数点以下2桁
print(f"{value:.2f}") # 1234.57
# 3桁区切りのカンマ
print(f"{value:,.2f}") # 1,234.57
# パーセント表示(自動で100倍して%)
rate = 0.035
print(f"{rate:.1%}") # 3.5%
# format関数でも同様
print(format(value, ".3f")) # 1234.568
1234.57
1,234.57
3.5%
1234.568
表示丸めと計算丸めは目的が異なります。
集計や請求額の算出はDecimal
で丸め、表示はフォーマットで整えるなど、役割を分けましょう。
まとめ
本記事では、Pythonの整数(int)と小数(float)の基本、四則演算、混在計算と型変換、浮動小数点の誤差と丸めまでを一通り解説しました。
割り算/
は常にfloatを返すこと、整数割りは//
で行うこと、負数の切り捨てが方法によって異なることを押さえておくと、思わぬバグを避けられます。
さらに、0.1 + 0.2 ≠ 0.3といった誤差の本質を理解し、用途に応じてround
、Decimal
、表示フォーマットを使い分けるのが実践的です。
まずは小さなスクリプトで動作を確かめ、型と結果が想定通りかをtype
や出力で確認する習慣を身につけてください。