Pythonで5 / 2のような割り算を実行すると、2.5という小数(浮動小数点数)が返ってきます。
しかし、プログラムを書いていると、小数部分を切り捨てて2という整数だけが欲しい場面は非常に多いものです。
「
//演算子とint()で切り捨てるのは、何が違うの?」このような疑問を解決するため、この記事では、Pythonで割り算の切り捨てを行う3つの主な方法と、それぞれの特徴、特に多くの人が混同しやすい「負の数(マイナス)の割り算」における挙動の違いを、サンプルコードを交えてわかりやすく解説します。
【本記事の信頼性】
- 執筆者は元エンジニア
- 大手プログラミングスクールのWebディレクター兼ライターを経験
- 自らも地元密着型のプログラミングスクールを運営
受講生から評判の良いプログラミングスクール
スクール |
特徴 |
受講料金 |
| 大手比較サイトで4年連続人気NO.1!受講生からの評判も非常に高く、Web系のエンジニアを目指すならRUNTEQ一択。 | 657,000円 (最大約53万円の給付金が適用される) |
|
| 月単価80万円以上の現役エンジニア講師による指導!一度入会すればサポートは半永久的。 | 498,000円 |
|
| 格安で質の高いWeb制作スキルを習得したい人におすすめ!業界最安級の料金でありながら、コミュニティやサポートが充実。 | 129,800円~ |
|
| 完全無料でプログラミングが学べる貴重なスクール!最短1ヶ月で卒業可能。ゼロスク運営会社への就職もできる。 | 完全無料 |
|
| 長期間に渡って学習し、希少人材を目指す人に最適なスクール!受講料は高いものの、高収入を得られる人材を目指せる。 | 96~132万円 |
Pythonにおける2つの割り算演算子
Pythonには、2種類の割り算演算子があり、それぞれ返す結果が異なります。
まずはこの基本を理解しておきましょう。
1. /(除算): 通常の割り算
/(スラッシュ1つ)は、私たちが数学で習うものと同じ、通常の割り算を行います。
結果は必ず浮動小数点数(float)になります。
result = 7 / 2
print(result)
print(type(result))
result_int = 4 / 2
print(result_int)
print(type(result_int))
実行結果は以下の通りです。
3.5
<class 'float'>
2.0
<class 'float'>
7 / 2が3.5になるのはもちろん、4 / 2のように割り切れる場合でも、結果は整数の2ではなく2.0という浮動小数点数になる点が特徴です。
2. //(除算(切り捨て)): 商の整数部分を得る
//(スラッシュ2つ)は、割り算を行った結果の「商の整数部分」だけを返す演算子です。
一般的に「切り捨て除算」と呼ばれます。
result = 7 // 2
print(result)
print(type(result))
result_float = 7.0 // 2.0
print(result_float)
print(type(result_float))
実行結果は以下の通りです。
3
<class 'int'>
3.0
<class 'float'>
7 // 2の結果が3となり、小数部分が切り捨てられているのがわかります。
なお、7.0 // 2.0のように、計算に浮動小数点数が含まれる場合は、結果も3.0のように浮動小数点数になります。(整数部だけが残る点は同じです)
割り算を切り捨てる3つの方法
「割り算の切り捨て」を実現するには、主に3つのアプローチがあります。
//演算子を使うのが最も直接的ですが、他の方法も知っておくと役立つでしょう。
方法1: // 演算子を使う(最も推奨)
前述の通り、Pythonで割り算の切り捨てを行いたい場合の、最も直接的でPythonic(パイソニック:Pythonらしい)な方法です。
# 7を2で割った商の整数部
quotient = 7 // 2
print(quotient)
# 10を3で割った商の整数部
quotient = 10 // 3
print(quotient)
実行結果は以下の通りです。
3
3
特別なライブラリのインポートも不要で、コードも簡潔です。
方法2: math.floor() を使う
mathモジュールは、数学的な計算を行うための標準ライブラリです。 この中のfloor関数(floor=床)は、引数の数値以下の最大の整数を返します。つまり、小数部分を切り捨てるのと同じ働きをします。
import math
# 通常の割り算の結果を...
result_float = 7 / 2 # 3.5
# math.floor()で切り捨てる
quotient = math.floor(result_float)
print(quotient)
実行結果は以下の通りです。
3
import mathという一手間はかかりますが、//演算子を知る前からfloorという単語に馴染みがある人にとっては、直感的に理解できるかもしれません。
方法3: int() で浮動小数点数を整数に変換する
int()関数は、値を整数(integer)型に変換する組み込み関数です。
浮動小数点数をint()で変換すると、小数部分は単純に切り捨てられます(0に近い方向への切り捨て)。
# 通常の割り算の結果を...
result_float = 7 / 2 # 3.5
# int()で整数に変換する
quotient = int(result_float)
print(quotient)
実行結果は以下の通りです。
3
これもmath.floor()と同じ結果になりました。
一見すると、//もmath.floor()もint()も、正の数の割り算では同じ結果を返すように見えます。
しかし、これらには決定的な違いが存在するのです。
【最重要】負の数における//とint()の決定的な違い
正の数の計算では同じ結果を返していた//とint()ですが、負の数の割り算を行うと、まったく異なる結果を返します。
これはPython初学者が非常につまずきやすいポイントです。
-7 / 2は -3.5 です。
これを切り捨てるとどうなるでしょう?
// は「負の無限大」方向へ切り捨てる (Floor)
//演算子は、「床(floor)」という名前の通り、その数値よりも小さい(数直線上で左にある)最大の整数へと丸めます。
これを「負の無限大への切り捨て」と呼びます。
result = -7 // 2
print(result)
実行結果:
-4
-3.5よりも小さい(数直線で左にある)整数は -4, -5, … ですが、その中で最大のものは-4です。
そのため、結果は-4となります。math.floor(-3.5)も同じく-4を返します。
int() は「0」方向へ切り捨てる (Truncate)
int()関数は、数学的な大小関係とは関係なく、単純に小数部分を「切り落とし」ます。
これは「0への切り捨て(Truncate)」と呼ばれます。
result = int(-7 / 2) # int(-3.5)
print(result)
実行結果:
-3
-3.5の小数部分である.5を単純に切り落とすため、結果は-3となります。
これは、多くの他のプログラミング言語(C言語やJavaなど)での整数除算の挙動と同じです。
どちらを使うべきか?
| 方法 | 7 / 2 (3.5) |
-7 / 2 (-3.5) |
挙動 |
|---|---|---|---|
// |
3 |
-4 |
負の無限大方向(床) |
math.floor() |
3 |
-4 |
負の無限大方向(床) |
int() |
3 |
-3 |
0方向(切り落とし) |
どちらを使うべきかは、あなたのプログラムが何をしたいかによります。
- 数学的に一貫した「床」関数が必要な場合(アルゴリズムの実装など):
//またはmath.floor() - 他の言語の挙動と同じように、単純に小数点を切り落としたい場合:
int()
Pythonでは、数学的な一貫性を重視して//演算子が「床」の動作を採用しています。
この違いを理解しておくことは、バグを防ぐ上で非常に重要です。
関連する割り算の操作
切り捨て(floor)の他にも、割り算に関連する便利な操作を覚えておくと役立ちます。
切り上げ: math.ceil()
切り捨て(床)の反対は、切り上げ(天井=ceiling)です。
math.ceil()関数は、その数値以上の最小の整数を返します。
import math
# 3.5以上で最小の整数
print(math.ceil(7 / 2)) # 3.5 -> 4
# -3.5以上で最小の整数
print(math.ceil(-7 / 2)) # -3.5 -> -3
実行結果は以下の通りです。
4
-3
余り(剰余): % 演算子
割り算の「余り」を求めたい場合は、%(パーセント)演算子を使います。
remainder = 7 % 2 # 7割る2は、商が3で余り1
print(remainder)
実行結果は以下の通りです。
1
商と余りを同時に: divmod()
組み込み関数のdivmod()を使うと、//演算子による商と%演算子による余りを、同時にタプルとして取得できます。
# 7を2で割った商と余り
quotient, remainder = divmod(7, 2)
print(f"商: {quotient}, 余り: {remainder}")
# -7を2で割った商と余り
quotient, remainder = divmod(-7, 2)
print(f"商: {quotient}, 余り: {remainder}")
実行結果は以下の通りです。
商: 3, 余り: 1
商: -4, 余り: 1
divmod(-7, 2)の結果が商: -4, 余り: 1となる点に注目してください。
これは//の挙動(商が-4)と一致しており、 (商 * 除数) + 余り = 元の数((-4 * 2) + 1 = -7)という数学的な関係が常に成り立つように設計されているためです。
まとめ
以上、Pythonの割り算における切り捨て方法について、詳しく解説しました。
なお、Pythonを体系的に学んだり、Pythonのスキルを高めたりするためには、プログラミングスクールを利用するのも有効です。
細かな疑問がすぐに解決するだけでなく、現役エンジニアが「質の高いポートフォリオ」を作成するための手助けをしてくれたり、エンジニア就職・転職のコツを教えてくれたりするなど、様々なメリットがありますので、独学に疲れた方は検討してみてはいかがでしょうか。



