Python 除法完整解析!捨去、進位、餘數的計算方式一次搞懂

目次

1. 前言

1-1. Python 除法的基本概念

在 Python 中,有多種方式可以進行除法運算。主要有以下三種類型,每種的結果格式與用途皆不同。

  1. 一般除法(/
  • 結果會是浮點數(float
  • 範例: 10 / 33.3333333333333335
  1. 向下取整除法(Floor 除法 //
  • 結果會去除小數部分,只保留整數
  • 範例: 10 // 33
  1. 取餘數的除法(%
  • 可以取得除法的餘數
  • 範例: 10 % 31

理解這些運算方式,並根據情況正確使用,是在 Python 中進行數值處理時非常重要的能力。

1-2. 如何讓除法結果成為整數

1-2-1. 使用 //(向下取整)

向下取整除法(//)會去除小數部分,僅保留整數。

print(10 // 3)  # 輸出: 3
print(-10 // 3) # 輸出: -4 (向負數方向取整)

1-2-2. 使用 int()

也可以將一般除法(/)的結果,透過 int() 明確轉換為整數。

print(int(10 / 3))  # 輸出: 3

不過請注意,int() 是單純捨去小數點以下的部分,處理負數時要特別小心。

1-3. 向下取整與四捨五入的差異

當需要將除法結果轉為整數時,理解「向下取整」與「四捨五入」的差異也很重要。

  • 向下取整:直接去除小數點以下(例:3.93
  • 四捨五入:根據小數進行四捨五入(例:3.54

在 Python 中,可以使用 round() 函數來進行四捨五入。

print(round(3.5))  # 輸出: 4
print(round(3.4))  # 輸出: 3

1-4. 本文將學到的內容

本文將針對 Python 中的除法運算進行詳細說明,特別是著重於「向下取整除法」的運用。接下來的章節會搭配實際範例與注意事項,讓你掌握更實用的技巧。

2. Python 除法:基本的 / 運算子

2-1. /(斜線)運算子的基本概念

在 Python 中使用 / 進行除法時,結果一定會是浮點數(float。即使兩個操作數都是整數,結果也會是 float

範例:一般除法

print(10 / 3)  # 輸出: 3.3333333333333335
print(8 / 2)   # 輸出: 4.0
print(5 / 2)   # 輸出: 2.5

如上所示,計算結果為 float 型別,並保留小數點以下的值。

2-2. intfloat 的差異

當使用 Python 的 / 運算子時,即使輸入是 int,結果也會變成 float

範例:包含整數的運算

a = 10
b = 2
c = a / b
print(c)           # 輸出: 5.0
print(type(c))     # 輸出: <class 'float'>

在這段程式中,ab 是整數,但 a / b 的結果是 float 型別的 5.0

2-3. 如果需要整數結果時的處理方式

2-3-1. 使用 //(向下取整除法)

使用 // 可以取得去除小數部分後的整數結果。

print(10 // 3)  # 輸出: 3
print(8 // 2)   # 輸出: 4

2-3-2. 使用 int() 明確轉換為整數

也可以先使用 / 進行除法,然後透過 int() 來捨去小數部分,取得整數。

print(int(10 / 3))  # 輸出: 3

但需特別留意在處理負數時的行為。

2-4. 使用 / 進行計算時的注意事項

2-4-1. 除以 0 會導致錯誤

在 Python 中,若除數為 0,會發生 ZeroDivisionError 錯誤,導致程式中斷。

print(10 / 0)  # ZeroDivisionError: division by zero

建議處理方式:
可先用 if 條件式檢查除數是否為零,避免錯誤發生。

a, b = 10, 0
if b != 0:
    print(a / b)
else:
    print("無法除以零")

2-4-2. 負數的除法

對負數使用 / 進行除法時,結果會遵循數學規則,並返回 float 類型的結果。

print(-10 / 3)  # 輸出: -3.3333333333333335
print(10 / -3)  # 輸出: -3.3333333333333335

在處理負數時,若需進行向下取整或四捨五入,請選擇合適的方法。

2-5. / 運算子的用途與總結

  • 使用 / 時,結果一定會是 float 類型
  • 如果需要整數結果,請使用 //int()
  • 除以 0 會導致錯誤,務必事先檢查
  • 處理負數除法時,須注意結果的方向與捨入方式

3. Python 的向下取整除法(Floor 除法・轉為整數)

3-1. //(Floor 除法)的基本概念

使用 // 運算子可以在除法中去除小數點以下,只取得整數部分的結果。

範例:Floor 除法

print(10 // 3)  # 輸出: 3
print(8 // 2)   # 輸出: 4
print(5 // 2)   # 輸出: 2

與一般的 /(斜線)除法不同,// 的結果是 整數(int 類型)

print(10 / 3)   # 輸出: 3.3333333333333335
print(10 // 3)  # 輸出: 3

也就是說,// 會忽略小數點以下的部分,只保留整數。

3-2. 與 int() 的差異

除了使用 // 之外,也可以透過 int() 將結果轉為整數。不過這兩者之間有些不同。

使用 int() 的情況

先使用 / 取得浮點數的結果,再透過 int() 轉為整數。

print(int(10 / 3))  # 輸出: 3

// 的差異

int() 會將 float 類型的數字捨去小數點以下,而 // 則直接以整數方式計算,因此 // 在效能上會更好。

print(type(10 // 3))       # 輸出: <class 'int'>
print(type(int(10 / 3)))   # 輸出: <class 'int'>

雖然結果看起來一樣,但 int() 是先進行浮點運算再轉型,// 則是直接整數運算,通常更推薦使用。

3-3. 注意負數的向下取整(例如 -10 // 3

當使用 // 運算子計算負數時,結果會根據數學上的「向下取整(floor)」行為,有時可能與直覺不一致。

範例:負數的 Floor 除法

print(-10 // 3)  # 輸出: -4

根據一般理解,-10 ÷ 3 = -3.333... 可能會期待結果是 -3,但因為 Python 的 //往小的方向取整,所以結果是 -4

正數與負數的比較

print(10 // 3)   # 輸出: 3
print(-10 // 3)  # 輸出: -4

這是因為 Python 的 // 運算子本質上是「floor()」的行為,在處理負數時要特別注意。

3-4. 與 math.floor() 的差異

Python 也提供 math.floor() 函數來執行向下取整的功能。

math.floor() 的基本用法

import math
print(math.floor(10 / 3))  # 輸出: 3
print(math.floor(-10 / 3)) # 輸出: -4

math.floor()// 一樣是向下取整,不過返回的型別會是 float

print(type(10 // 3))               # 輸出: <class 'int'>
print(type(math.floor(10 / 3)))    # 輸出: <class 'float'>

了解兩者差異後,可以根據用途選擇最合適的方法。

3-5. // 運算子的應用與總結

使用 Python 的 //(向下取整除法)可以快速取得整數結果,在以下情況特別實用:

  • 只需要整數結果時
  • 範例:計算分頁的總頁數
  items = 45
  per_page = 10
  total_pages = (items + per_page - 1) // per_page
  print(total_pages)  # 輸出: 5
  • 處理負數時需特別留意
  • // 會向小的方向取整,結果可能不是你原本預期的
  • 希望加快計算速度、避免小數處理時
  • int(10 / 3) 的寫法比 10 // 3 更慢,因此 // 效率較佳

4. Python 的向上取整除法(math.ceil()

4-1. math.ceil() 的基本概念

Python 中的 math.ceil() 函數會無條件將小數點以上進位為整數。此函數屬於 math 模組,因此使用前需先 import math

範例:math.ceil() 的使用方式

import math

print(math.ceil(10 / 3))  # 輸出: 4
print(math.ceil(5 / 2))   # 輸出: 3
print(math.ceil(4.2))     # 輸出: 5

如上所示,math.ceil() 會將小數全部進位為最接近的較大整數。

4-2. math.ceil()//(Floor 除法)的差異

向上取整與向下取整的行為正好相反,理解它們的差異非常重要。

向下取整(//

print(10 // 3)  # 輸出: 3
print(-10 // 3) # 輸出: -4
  • //去除小數並往較小的方向取整(對負數更小)
  • 處理負數時要特別注意結果

向上取整(math.ceil()

import math
print(math.ceil(10 / 3))  # 輸出: 4
print(math.ceil(-10 / 3)) # 輸出: -3
  • math.ceil()無條件往較大的方向取整
  • 對於負數,結果會趨近於零

4-3. 使用 math.ceil() 的實用範例

4-3-1. 計算總頁數

例如,當你需要將資料分頁顯示時,即使最後一頁不滿,也需要多加一頁,這時就適合使用向上取整。

import math

items = 45        # 總項目數
per_page = 10     # 每頁顯示的項目數

total_pages = math.ceil(items / per_page)
print(total_pages)  # 輸出: 5

4-3-2. 計算每人需處理的次數

假設有 100 個任務要由 5 人處理,為了平均分配,即使不能整除也必須有人多處理一次。

import math

tasks = 100       # 總任務數
workers = 6       # 人員數

tasks_per_worker = math.ceil(tasks / workers)
print(tasks_per_worker)  # 輸出: 17

4-4. 不使用 math.ceil() 也能實現向上取整

其實在不使用 math.ceil() 的情況下,也可以透過簡單的公式進行向上取整。

使用公式 (a + b – 1) // b

透過將被除數 a 加上 b - 1 再除以 b,即可達到向上取整的效果。

def ceil_div(a, b):
    return (a + b - 1) // b

print(ceil_div(10, 3))  # 輸出: 4
print(ceil_div(5, 2))   # 輸出: 3

4-5. math.ceil() 的應用場景與總結

Python 的 math.ceil() 函數非常適合需要將小數進位為整數的情況,尤其適合下列用途:

  • 計算頁數或群組數
import math
items = 45
per_page = 10
total_pages = math.ceil(items / per_page)
print(total_pages)  # 輸出: 5
  • 即使有餘數也希望多處理一次時
import math
tasks = 100
workers = 6
tasks_per_worker = math.ceil(tasks / workers)
print(tasks_per_worker)  # 輸出: 17
  • 想用純整數方式實現向上取整
def ceil_div(a, b):
    return (a + b - 1) // b
print(ceil_div(10, 3))  # 輸出: 4
侍エンジニア塾

5. 同時取得商與餘數的方法

5-1. 使用 %(模除運算子)計算餘數

在 Python 中,最基本的取得餘數方法是使用 %(模除運算子)。

範例:餘數的計算

print(10 % 3)  # 輸出: 1
print(20 % 7)  # 輸出: 6

a % b 表示 a 除以 b 後的餘數。例如 10 % 3 等於 10 ÷ 3 = 3 餘 1,所以輸出 1

注意:處理負數時的餘數

Python 中的 % 運算子會根據除數的符號決定餘數方向,處理負數時要特別小心。

print(-10 % 3)  # 輸出: 2
print(10 % -3)  # 輸出: -2

這是因為 Python 中的 % 會讓餘數與除數具有相同的符號,這一點與其他語言可能不同。

5-2. 使用 divmod() 同時取得商與餘數

Python 提供的 divmod() 函數可以一次取得商與餘數,不需分別計算兩次。

divmod() 的基本用法

quotient, remainder = divmod(10, 3)
print(quotient)  # 輸出: 3
print(remainder) # 輸出: 1

divmod(10, 3) 會回傳一個元組 (3, 1),其中 3 是商,1 是餘數。

處理負數時的行為

divmod() 的行為與 //% 一致,也會依照 Python 的規則處理符號。

print(divmod(-10, 3))  # 輸出: (-4, 2)
print(divmod(10, -3))  # 輸出: (-4, -2)

可以看到,商的部分與 // 相同,餘數則與 % 相同。

5-3. 與分別使用 //% 的比較

divmod(a, b) 相當於同時計算 a // ba % b,來比較兩種寫法的差異。

方式一:分別計算兩次

a = 10
b = 3
quotient = a // b
remainder = a % b

print(quotient)  # 輸出: 3
print(remainder) # 輸出: 1

這種方式需要執行兩次運算。

方式二:使用 divmod()

quotient, remainder = divmod(10, 3)
print(quotient)  # 輸出: 3
print(remainder) # 輸出: 1

這種方式只需呼叫一次函數,更有效率且簡潔

5-4. divmod() 的實用範例

5-4-1. 將總分鐘轉換為小時與分鐘

例如,將總時間 145 分鐘轉換為幾小時幾分鐘:

minutes = 145
hours, remainder_minutes = divmod(minutes, 60)

print(f"{hours}小時{remainder_minutes}分鐘")  # 輸出: 2小時25分鐘

5-4-2. 硬幣換算的計算

使用 divmod() 可以快速將金額換算成硬幣組合:

amount = 758  # 758 日圓
yen_100, remainder = divmod(amount, 100)
yen_50, remainder = divmod(remainder, 50)
yen_10, remainder = divmod(remainder, 10)

print(f"100円: {yen_100}枚, 50円: {yen_50}枚, 10円: {yen_10}枚, 剩餘: {remainder}円")

5-5. 商與餘數的計算方法總結

在 Python 中可以依需求選擇不同方式計算商與餘數,以下是常見方法比較:

方法使用方式可得商可得餘數
//a // b✔️
%a % b✔️
divmod()divmod(a, b)✔️✔️

特別是 divmod() 可以同時取得商與餘數,減少計算次數,撰寫更有效率的程式碼。

6. Python 除法常見問題(FAQ)

6-1. 如何讓 Python 的除法結果變成整數?

在 Python 中,想讓除法結果為整數有以下三種常用方式:

① 使用 //(向下取整除法)

// 可取得去除小數後的整數結果。

print(10 // 3)  # 輸出: 3
print(-10 // 3) # 輸出: -4

② 使用 int()

先使用 / 得到浮點數,再使用 int() 轉為整數。

print(int(10 / 3))  # 輸出: 3

注意:int() 是無條件捨去小數,處理負數時結果可能與 // 不同。

③ 使用 math.floor()

math.floor() 會將浮點數向下取整為最接近的整數。

import math
print(math.floor(10 / 3))  # 輸出: 3
print(math.floor(-10 / 3)) # 輸出: -4

6-2. 向下取整和四捨五入有什麼不同?

  • 向下取整:使用 //math.floor()
  • 四捨五入:使用 round()

範例:四捨五入

print(round(3.5))  # 輸出: 4
print(round(3.4))  # 輸出: 3

Python 的 round() 採用銀行家捨入法(偶數捨入),所以 round(2.5)2round(3.5)4

6-3. int()math.floor() 有什麼差異?

方法行為處理負數回傳型別
int()捨去小數點int(-3.9) → -3int
math.floor()總是向下取整math.floor(-3.9) → -4float

由於處理負數時行為不同,選用時需根據需求判斷。

6-4. 對負數做向下取整要注意什麼?

Python 的 //向負無限方向取整,處理負數時可能會與直覺不同。

print(-10 // 3)  # 輸出: -4

這類情況可以改用 math.floor() 做更明確的控制。

6-5. 如何指定四捨五入的小數位數?

使用 round() 時可以指定要保留的小數點位數。

print(round(3.14159, 2))  # 輸出: 3.14
print(round(3.14159, 3))  # 輸出: 3.142

6-6. 除以 0 會發生什麼事?

在 Python 中,若進行除以 0 的運算,會出現 ZeroDivisionError

print(10 / 0)  # ZeroDivisionError: division by zero

預防方式是先用 if 判斷除數是否為 0。

a, b = 10, 0
if b != 0:
    print(a / b)
else:
    print("無法除以零")

6-7. divmod() 有哪些優點?

divmod() 可同時取得商與餘數,減少計算次數,更有效率。

quotient, remainder = divmod(10, 3)
print(quotient)  # 輸出: 3
print(remainder) # 輸出: 1

6-8. 如何在 Python 中進行更精確的小數計算?

若對精度要求很高,建議使用 decimal 模組以避免浮點誤差。

from decimal import Decimal

a = Decimal('10.1')
b = Decimal('3.3')
print(a / b)  # 可進行精確計算

6-9. 如何將除法結果格式化為字串?

可以使用 f-stringformat() 將除法結果格式化輸出。

result = 10 / 3
print(f"{result:.2f}")        # 輸出: 3.33
print("{:.2f}".format(result))  # 輸出: 3.33
年収訴求

7. 總結

7-1. 根據不同情境選擇最適合的方法

Python 中的除法方式有多種,根據情況選擇合適的方法非常重要。以下是根據不同需求推薦的做法:

情境推薦方法說明
需要保留小數點的精確計算/一般除法(結果為浮點數)
需要整數結果(向下取整)//Floor 除法,回傳整數類型
將浮點數轉為整數(捨去小數)int()float 類型轉成 int(注意負數行為)
希望向上取整math.ceil()使用 math.ceil() 進行無條件進位
只想取得餘數%取得除法後的餘數
想同時取得商與餘數divmod()一次取得商與餘數,效率較高
避免浮點數誤差,追求高精度decimal.Decimal使用高精度模組 decimal

7-2. 使用除法時的注意事項

在 Python 中進行除法運算時,請特別注意以下幾點:

1. //(Floor 除法)處理負數的方式不同

//朝向較小方向取整,負數的結果可能不如預期。

print(-10 // 3)  # 輸出: -4

理解此行為後,如有需要也可以選擇使用 math.floor()

2. 除以零會導致錯誤

Python 中除數為 0 時會引發 ZeroDivisionError,建議事先檢查。

a, b = 10, 0
if b != 0:
    print(a / b)
else:
    print("無法除以零")

3. round() 採用銀行家捨入法(偶數捨入)

這種捨入規則會將 .5 四捨五入到最接近的偶數。

print(round(2.5))  # 輸出: 2
print(round(3.5))  # 輸出: 4

4. 使用 divmod() 可提升效能

與分別使用 //% 相比,divmod() 可減少運算次數。

quotient, remainder = divmod(10, 3)
print(quotient)  # 輸出: 3
print(remainder) # 輸出: 1

7-3. 本文總結

Python 中的除法運算方式相當多元,每種方法都有不同的用途與特性。以下為本篇的重點整理:

  1. 一般除法(/:回傳 float 類型的結果
  2. 若需要整數結果,使用 //(Floor 除法)
  3. 負數的 // 結果會向下取整(可能是更小的整數)
  4. 四捨五入時可使用 round()
  5. 若要進位取整,使用 math.ceil();向下取整則用 math.floor()
  6. 求餘數用 %,同時計算商與餘數用 divmod()
  7. 需要高精度運算時,建議使用 decimal.Decimal

若能掌握這些除法運算方式,將能更靈活、正確地處理各種資料計算任務。

本文到此結束,希望你對 Python 的除法處理有更深入的了解。若仍有疑問,建議查閱官方文件或實際撰寫程式碼來加深理解。

讓我們一起持續學習,讓 Python 編程之路更順利、更高效!