【Python】割り算の切り捨てをわかりやすく解説

はじめに

Pythonで数値を扱う際、割り算の結果を切り捨てたい場面は多いかもしれません。 例えば小数点以下を無視して「残りは何個」「いくつのグループに分割できるか」などのときに役立ちます。

本記事では、初心者でも理解しやすいようにPythonの割り算における切り捨てにフォーカスし、使い方を解説していきます。 演算子//だけでなく、関連する関数divmod()math.floor()などの方法も取り上げます。 実務の場面をイメージしながら参考にしていただければ幸いです。

この記事を読むとわかること

  • Pythonで切り捨ての割り算を行う基本的な方法
  • //演算子やdivmod()の具体的な使い方
  • 負の数や小数が含まれるケースでの注意点
  • 実務シーンでの活用例やコードサンプル

割り算の基本的な考え方

Pythonでは割り算を行うときに/演算子と//演算子があります。 これらは同じ割り算ですが、結果の型や扱い方が異なります。

/演算子と//演算子の違い

  • / : 小数点以下まで含めた結果を返す(浮動小数点数)。
  • //: 小数点以下を切り捨てて返す(整数)。

プログラミングでいう「切り捨て」は、要するに余りを無視するということです。 ただし、負の数を含む場合は数学的に「より小さい方向」に丸められるように感じる場面があるので注意しましょう。

例えば、以下のコードを見てみます。

print(7 / 3)   # 2.3333333333...
print(7 // 3)  # 2

print(-7 / 3)  # -2.3333333333...
print(-7 // 3) # -3

この例では、7 / 3は少数の2.3333...を返しますが、7 // 3は整数の2を返します。 一方で-7 / 3は-2.3333...を返すのに対し、-7 // 3は-3を返します。 これは「切り捨て」が常に小数点以下を単純に削るだけではなく、負の場合は結果がさらに小さい値(このケースでは-3)になるためです。

実務でも、金額計算などで意図しない丸めが発生するとトラブルにつながることがあります。 そのため、切り捨ての仕様をしっかり理解することは重要です。

//演算子の具体的な使い方

Pythonで割り算の切り捨てといえば、まず//演算子を使うケースが多いでしょう。 小数点を無視して整数として計算したいときに活用します。

基本的な例

以下のサンプルでは、商品をグループ分けするイメージを示します。 例えば10個の商品を3グループで分けたいとき、各グループに何個ずつ入るかを計算します。

items = 10
groups = 3
result = items // groups

print(result)  # 3

このコードは、10個の商品を3グループに分けたときに「1グループあたり3個配分できる」と出力します。 3×3 = 9個が分配され、1個は余る計算です。

ここで、あくまであまり分は無視されています。 余った分が何個あるかも知りたい場合は、次のセクションで紹介するdivmod()を使うと便利です。

負の数を含む場合

実務では、在庫数量が負になることは滅多にないかもしれません。 しかし、計算の一部で負の値が入ることもゼロとは言い切れませんので、挙動を把握しておくのが望ましいでしょう。

print(-7 // 3)  # -3
print(7 // -3)  # -3
print(-7 // -3) # 2

ここでのポイントは、Pythonの切り捨ては常に結果が小さくなる方向に丸められるということです。 -7 // 3 は「-2.333...を小さくした整数」なので-3になります。 このように符号が混在するケースでは想定外の結果にならないよう注意が必要です。

divmod()を使った切り捨て

divmod()は割り算(商)と余りを同時に取得できる便利な組み込み関数です。 「一度に商と余りを知りたい」ときに使うとコードがすっきりすることがあります。

divmod()の基本的な使い方

divmod(a, b)を呼び出すと、(商, 余り)のタプルが返されます。 具体例を見てみます。

a = 10
b = 3
result = divmod(a, b)

print(result)       # (3, 1)
print("商:", result[0])  # 3
print("余り:", result[1]) # 1

このコードでは10 ÷ 3の結果として、商が3、余りが1であることがわかります。 divmod()(a // b, a % b)と同等の動作ですが、1回の呼び出しで同時に得られるので便利です。

実務での活用例

例えばページネーションの実装などで、「最後のページが全部埋まらない可能性がある」ケースを計算することがあります。 総アイテム数を1ページあたりの表示件数で割ったとき、何ページできるかと、最終ページに余分に載せるアイテム数はいくつなのかを同時に知りたい場面です。

total_items = 28
per_page = 6
pages, remainder = divmod(total_items, per_page)

print(pages)     # 4
print(remainder) # 4

このコードでは、28個のアイテムを1ページ6件として区切ると、4ページ分作れて4件余る計算です。 実際のページネーションでは「ページ数は4ページでは足りないので最終ページも作ってあげよう」といった条件分岐に役立てられます。

math.floor()との違い

Pythonには組み込み関数math.floor()があります。 これは与えられた数値を小さい方向に切り捨てる関数です。

math.floor()の特徴

  • 数値(浮動小数点数)を与えると、小数点以下を切り捨てる。
  • すでに整数の入力ならそのまま返す。
  • 負の値が含まれる場合でも、より小さい方向へ丸める。

例として、10.9を入れると10になりますが、-10.1を入れると-11になります。

// との使い分け

// は演算子として整数同士の演算に使いやすい一方、math.floor()は小数の状態で明示的に切り捨てたいときに使われます。 「数値の変換処理が複雑になっており、小数点を含んだ変数を後で整数に丸めたい」という場面で便利です。

例えば、何らかの演算で小数が出てきたあと切り捨てたい場合はこう書きます。

import math

x = 7 / 3    # 2.3333...
y = math.floor(x)
print(y)     # 2

一方、最初から整数を使って割り算するなら//を使う方がコードが読みやすいことが多いでしょう。 単純な整数演算であれば演算子//を選ぶ、浮動小数点から切り捨てが必要ならmath.floor()を選ぶ、と使い分けるのがスムーズです。

int()との違い

切り捨てというと、組み込み関数int()も浮かぶかもしれません。 int(2.9)は2になり、int(-2.9)は-2になります。 しかしint()が行うのは「0に近い方向への切り捨て」です。

int()の例

  • int(2.9) -> 2
  • int(-2.9) -> -2

負の値を含む場合、「0に近い方」に丸めます。 //math.floor()が「常に小さく丸める」のとは挙動が違うので注意してください。

小数が混在する場合の注意点

Pythonでは整数同士の計算であっても、どちらかが小数型(float)の場合に少数計算が起こることがあります。 思わぬ型変換が起きた結果、結果が小数点付きになり、それをさらに//に適用したりするケースがあるかもしれません。

例えば、こんなコードを考えます。

a = 5.0  # float型
b = 2    # int型
c = a / b
d = a // b

print(c) # 2.5
print(d) # 2.0

ここでa // bの結果は2.0となり、型としてはfloat型で返る場合があります。 「割り算の結果は整数になるはず」と思い込んでいると、予期せぬ型になっているかもしれません。 実務シーンで型が想定外になり、エラーや誤差の原因になることもあるので、気をつけて扱いましょう。

負の方向への丸めと実務での影響

負の値で丸めるときは結果が直感と異なる可能性があります。 例えば販売管理システムでマイナス値が計上されるようなケースはあまり一般的ではありませんが、在庫が不足したときのシミュレーションで負の値が出ることはありえます。

実務シーンでは、そもそもマイナスが発生する段階でエラーとして処理することもあるかもしれません。 ただ、負の数を扱うかどうかにかかわらず、//の動作を正しく把握しておくことで予期せぬバグを防ぎやすくなります。

具体的な活用シーン

ここまでで、割り算の切り捨てについて主要な方法や注意点を解説してきました。 最後に実務でよくあるシーンを例示しましょう。

在庫管理システムでの梱包数計算

例えばメーカーから仕入れる商品の最小梱包単位が10個入りの場合、注文数を10で割って「何梱包必要か」を算出したいシーンが想定できます。

order = 27
unit = 10
boxes = order // unit

print(boxes)  # 2

ここでは2梱包必要という結果ですが、実際には7個分が単独で必要になるので「追加で1梱包必要」という判断をするかもしれません。 そのため、「あまりがあるかどうか」で次のアクションを分けたい場合、divmod(order, unit)を使うのも便利です。

ページネーションでのページ数算出

ページネーションでは、総アイテム数を1ページあたりの表示件数で割り、すべてのアイテムを表示するのに何ページ必要かを考えます。 このとき、ちょうど割り切れない場合は1ページ追加しないとアイテムが余ってしまいます。

total_items = 50
per_page = 7
pages = total_items // per_page

if total_items % per_page == 0:
    print(pages)      # 7ページ
else:
    print(pages + 1)  # 8ページ

小数点以下を切り捨てた値と、あまりの有無を組み合わせる一例です。 ページネーションは多くのウェブアプリケーションで使われます。

金額計算

通貨の計算では小数点以下を切り捨てたい場面が多くあります。 ただし金額計算においては「小数点以下を必ず切り捨てる」「四捨五入する」「常に切り上げる」などルールが異なる場合があります。 Pythonでは//のほか、丸め方のルールを細かく指定できるdecimalモジュールなどが使われることもあるため、要件に応じて最適な方法を検討すると良いでしょう。

金額計算での丸め方は国や企業の規定によって異なることがあります。 Pythonには複数の丸め方法があるので、要件に合った手段を選ぶと安心です。

負の数や小数の丸めをテストするコツ

実務では、テストケースを作成し、想定どおりの丸めが行われるか確認することが大切です。 特に負の数が関わるケースは混乱しやすいので、あらかじめエッジケースをテストしておくといいでしょう。

サンプルコード

import math

test_values = [5, -5, 2.5, -2.5, 0]
for val in test_values:
    print(f"値: {val}")
    print(f"  //演算子で2割り: {val // 2}")
    print(f"  int()で丸め: {int(val)}")
    print(f"  floor()で丸め: {math.floor(val)}")
    print("-" * 20)

ここでいくつかパターンを試すと、「思ったより負の数が小さくなる」「int()は0方向に丸める」という違いが鮮明にわかります。 こうしたテストを組み込むことで、バグを未然に防ぐのに役立ちます。

小数点以下をさらに処理したい場合

割り算の結果、小数点以下の部分を取り出して別途計算したいケースもあるかもしれません。 そんなときはfmod()や余り演算子%を使って小数部を取得し、それをもとに追加計算する方法が考えられます。

以下の例では「何か処理をしたあとに、小数部分だけ再利用する」というパターンをイメージしています。

import math

value = 7 / 3  # 2.3333...
integer_part = value // 1  # 2.0
fraction_part = value % 1  # 0.3333...

print(integer_part)   # 2.0
print(fraction_part)  # 0.3333...

ここで得られたfraction_partを使って、さらに別の計算を行うこともできるでしょう。 こうした応用パターンを念頭におくと、実務ではより柔軟に割り算の結果を扱うことができます。

よくあるエラーやトラブル

割り算の切り捨てで起きやすいトラブルとしては、意図せず型がfloatになったり、負の数が混在して思わぬ値が返ってきたりするケースが多いです。 これを防ぐためには、計算に用いる変数がどんな型でどんな値域になるのかをあらかじめ想定しておくことが大切です。

加えて、金額や大きい数を扱う場合には、丸め誤差が積み重なる可能性もあります。 この点については、decimalモジュールで桁数を管理したり、金額計算の規則に従った丸めを行うなど、単なる//だけに頼らない対策を検討するといいかもしれません。

まとめ

Pythonで割り算を切り捨てるには、演算子//がまず挙げられます。 小数点以下を気にせず整数部分だけ使いたいときは、最もシンプルな方法と言えるでしょう。

さらに、商と余りを同時に取得できるdivmod()、小数値を明示的に切り捨てるmath.floor()、0に近い方向へ丸めるint()などの手段もあります。 実務で使うときは、その場面に合わせて「どの丸め方が必要か」をしっかり検討して選択するのがおすすめです。

負の数を含むと結果が直感と異なる場合があるので、あらかじめテストで確認しておくとトラブルを回避しやすくなります。 用途に合わせた丸め方を身につけておくことで、数値計算での混乱を減らし、余裕をもってPythonのプログラムを組み立てていけるでしょう。

Pythonをマスターしよう

この記事で学んだPythonの知識をさらに伸ばしませんか?
Udemyには、現場ですぐ使えるスキルを身につけられる実践的な講座が揃っています。