Q1次のコードの実行結果はどれですか?
print(type(10 / 2))
int と float の使い方
Python の数値型 int と float の使い方を学びます。四則演算と / と // の違い、float の精度問題、型変換まで一通り図解で押さえます。
Pythonの数値は2種類
Pythonで数を扱う型は大きく 2種類あります。整数を扱う int と、小数を扱う float(浮動小数点数) です。
どちらも数なので、加減乗除や余りなどの基本的な計算はすべてできます。
ただし書き方と精度がそれぞれ違うため、場面に応じて使い分けます。
. を含めずに書けば int。
. を含めて書けば float。
両方とも type() で確認できる。
整数として書きたい数値であっても、3.0 のように .0 を付ければ float になります。逆に 175 とだけ書けば int です。
マイナスの値も -5 で int、-5.5 で float です。
# int(整数)
age = 25
print(type(age)) # <class 'int'>
# float(浮動小数点数)
weight = 175.5
print(type(weight)) # <class 'float'>
# 同じ「3」でも書き方で型が変わる
print(type(3)) # <class 'int'>
print(type(3.0)) # <class 'float'>
# マイナスもそれぞれ
print(type(-10)) # <class 'int'>
print(type(-10.5)) # <class 'float'>
演算子をひと通り見る
数値計算で使う演算子は以下の7種類です。+ - * / の四則演算は他の言語と同じですが、//(整数除算)、%(剰余)、**(べき乗) の3つは Python でよく使うので押さえておきましょう。
| 演算子 | 意味 | 例 | 結果 |
|---|---|---|---|
| + | 加算 | 10 + 3 | 13 |
| - | 減算 | 10 - 3 | 7 |
| * | 乗算 | 10 * 3 | 30 |
| / | 除算(常に float) | 10 / 3 | 3.3333... |
| // | 整数除算(小数切り捨て) | 10 // 3 | 3 |
| % | 剰余(割り算の余り) | 10 % 3 | 1 |
| ** | べき乗 | 2 ** 10 | 1024 |
「/」 は int 同士でも float を返す
10 / 2 は 5 ではなく 5.0(float)です。
Python の / は常に float を返すように設計されているため、整数同士でも結果が float になります。
整数で結果が欲しい場合は // を使ってください。
# 四則演算
print(10 + 3) # 13
print(10 - 3) # 7
print(10 * 3) # 30
# 除算は常に float
print(10 / 3) # 3.3333333333333335
print(10 / 2) # 5.0 (割り切れても float)
# 整数除算(切り捨て)と剰余
print(10 // 3) # 3
print(10 % 3) # 1
# べき乗:a ** b は「a の b 乗」
print(2 ** 10) # 1024
print(3 ** 2) # 9
print(2 ** 0.5) # 1.4142135623730951 (平方根として使える)
複合代入演算子(+= / -= など)
「x = x + 1」 のように「自分自身に何かして書き戻す」処理は頻繁に登場します。
この書き方は 「x += 1」 と省略でき、これを複合代入演算子と呼びます。
`+ - / // % * のすべてに対応する形があります。
短縮形は「自分自身に演算して書き戻す」を 1 行で書く構文。
内部的には必ず右側の「展開した形」と同じ動きをする。
例として x = 10 に各演算を当てはめた結果を示す。
score = 10
score += 5 # 10 + 5 → 15
print(score) # 15
score *= 2 # 15 * 2 → 30
print(score) # 30
score -= 7 # 30 - 7 → 23
print(score) # 23
# float でも同じように使える
weight = 60.0
weight += 1.5
print(weight) # 61.5
int と float を混ぜた演算
int と float を混ぜて計算すると、結果は必ず float になります。これは Python が精度の高い方に自動で型を揃える仕組みのためです。
また、前述の通り /(除算)は int 同士でも結果が float、//(整数除算)は int 同士なら int になります。
int + int = int。
ただし / は常に float。
片方でも float なら結果は float に揃う。
# int 同士は int
print(10 + 3) # 13 → int
print(type(10 + 3)) # <class 'int'>
# 片方が float なら結果も float
print(10 + 3.0) # 13.0
print(type(10 + 3.0)) # <class 'float'>
# / は int 同士でも float
print(10 / 2) # 5.0
print(type(10 / 2)) # <class 'float'>
# // は int 同士なら int
print(10 // 3) # 3
print(type(10 // 3)) # <class 'int'>
# // でも片方が float なら float
print(10 // 3.0) # 3.0
print(type(10 // 3.0)) # <class 'float'>
float の精度には限界がある
コンピュータは float を2進数の近似値として保持しています。そのため、人間から見ると単純な計算でもわずかな誤差が出ることがあります。
以下の例は有名な「float あるある」で、入門者が必ずどこかでハマるポイントです。
厳密な計算が必要なら Decimal
金額計算などわずかな誤差も許されない場面では、標準ライブラリの Decimal 型を使うと正確な小数計算ができます。本記事では扱いませんが、「float は近似値」「厳密な計算には別の道具がある」とだけ覚えておきましょう。
int() と float() で型を切り替える
数値どうしの型変換には組み込み関数 int() と float() を使います。
注意したいのは int() は小数点以下を「切り捨て」することです。四捨五入ではないため、3.9 を int() に渡すと 4 ではなく 3 になります。マイナスの場合は 0 に近い側へ寄せられるので、-3.9 は -4 ではなく -3 になります。
# float → int は「切り捨て」(四捨五入ではない!)
print(int(3.9)) # 3
print(int(3.1)) # 3
print(int(-3.9)) # -3 (0 に近い側へ)
# int → float は .0 が付くだけ
print(float(5)) # 5.0
print(float(-2)) # -2.0
# 型変換を変数に入れて使うパターン
a = 3.9
a = int(a)
print(a, type(a)) # 3 <class 'int'>
b = 5
b = float(b)
print(b, type(b)) # 5.0 <class 'float'>
この記事では、次の内容を学びました。
- int と float の違い
- べき乗 「**」 と複合代入(+= など)
- 除算 「/」 と整数除算 「//」 の戻り型の違い
- float の精度問題
- int() / float() による型変換
理解度チェック
まずは1問ずつ答えてみましょう。
Q2次のコードの実行結果はどれですか?
x = 10
x **= 3
print(x)`
Q3次のコードの実行結果はどれですか?print(int(-3.9))