本文 AI 產出,尚未審核
Python
變數與資料型別(Variables & Data Types)
主題:整數(int)與浮點數(float)
簡介
在程式設計的世界裡,數值型別是最常見、也是最基礎的資料類別。不論是寫一個簡單的計算機,還是開發大型的機器學習模型,都離不開 int(整數)與 float(浮點數)。
本單元將帶你深入了解 Python 中的整數與浮點數,說明它們的特性、相互轉換方式,以及在實務開發時需要留意的細節。掌握這些概念後,你才能寫出 正確、可預測且效能佳 的數值運算程式。
核心概念
1. 整數(int)— 基本特性
- Python 的
int支援任意長度,只要記憶體允許,就不會發生 overflow。 - 整數在記憶體中的儲存方式是二進位補數(two's complement),但在 Python 內部是以 大數演算法 實作,使用者不必關心位元長度。
程式碼範例 1:任意大整數
# 任意大的整數不會拋出 OverflowError
big_num = 1234567890123456789012345678901234567890
print(big_num) # 1234567890123456789012345678901234567890
print(type(big_num)) # <class 'int'>
2. 浮點數(float)— 基本特性
- Python 的
float採用 IEEE 754 雙精度(64 位元)實作,約有 15~17 位有效數字。 - 浮點數的表示方式是 科學記號(sign × mantissa × 2^exponent),因此在某些十進位運算上會出現 舍入誤差。
程式碼範例 2:浮點數的精度限制
a = 0.1 + 0.2
print(a) # 0.30000000000000004
# 雖然理論上應該是 0.3,但因為二進位表示的限制產生了微小誤差
3. 整數 ↔ 浮點數的相互轉換
| 方向 | 函式 | 會發生的情況 |
|---|---|---|
| int → float | float() |
直接轉換,可能出現科學記號顯示 |
| float → int | int() |
會 捨去小數部份(向 0 截斷),不會四捨五入 |
程式碼範例 3:型別轉換
i = 42
f = float(i) # 42.0
print(f, type(f))
f2 = 3.99
i2 = int(f2) # 3,捨去小數
print(i2, type(i2))
4. 常見的數學運算與除法行為
+、-、*:對int與float均支援,若任一操作元是float,結果皆為float。/(除法):永遠返回float,即使兩個都是int。//(地板除):返回整數除法結果,向負無限大取整。%(模數):返回餘數,結果型別與被除數相同。
程式碼範例 4:除法與地板除
a = 7
b = 2
print(a / b) # 3.5,結果是 float
print(a // b) # 3,結果是 int(地板除)
print(a % b) # 1,餘數
5. 內建函式與模組輔助
| 功能 | 函式 / 模組 | 說明 |
|---|---|---|
| 絕對值 | abs() |
取得正數 |
| 四捨五入 | round() |
可指定小數位 |
| 進位制轉換 | bin()、oct()、hex() |
轉成二、八、十六進位字串 |
| 高精度小數 | decimal.Decimal |
需要精確金融計算時使用 |
| 分式運算 | fractions.Fraction |
以分數形式保存精確值 |
程式碼範例 5:使用 decimal 提升精度
from decimal import Decimal, getcontext
# 設定全域精度為 28 位(預設值)
getcontext().prec = 28
x = Decimal('0.1')
y = Decimal('0.2')
z = x + y
print(z) # 0.3,沒有浮點誤差
常見陷阱與最佳實踐
浮點數比較
直接使用==可能因舍入誤差導致錯誤判斷。
最佳做法:使用math.isclose()或自行設定容差範圍。import math a = 0.1 + 0.2 print(math.isclose(a, 0.3)) # True除法得到意外的型別
5 / 2會得到2.5(float),若期待整數結果,請改用//。
最佳做法:明確使用//或在需要時手動int()轉型。大數運算的效能
任意長度的int雖然安全,但在大量迭代中可能拖慢程式。
最佳做法:若可預測數值範圍,使用int(固定長度)或numpy.int64。金融或會計領域的精度需求
使用float會產生不可預期的誤差。
最佳做法:改用decimal.Decimal或int(以最小貨幣單位儲存)。字串與數值的隱式轉換
Python 不會自動把字串轉成數值,必須手動int()或float()。
最佳做法:在取得外部輸入(如使用者輸入、檔案讀取)後,先驗證再轉型。
實際應用場景
| 場景 | 為何需要 int / float | 範例程式碼 |
|---|---|---|
| 計數器(網站點擊、API 請求) | 整數提供精確計數,且不會產生捨入誤差。 | counter += 1 |
| 金融交易(價格、金額) | 必須避免浮點誤差,常以 最小貨幣單位(如分)儲存為 int,或使用 Decimal。 |
price = Decimal('199.99') * qty |
| 科學計算(測量值、統計) | 需要浮點數的寬廣範圍與小數位。 | average = sum(values) / len(values) |
| 時間戳記(Unix 時間) | 使用 int 表示秒或毫秒,避免浮點不精確。 |
timestamp = int(time.time()) |
| 圖形與座標(遊戲開發) | 位置常用 float,但格子索引則用 int。 |
x, y = 12.5, 7.3、grid_x = int(x) |
總結
- 整數 (
int):任意長度、精確、適合計數與離散資料;在 Python 中不會 overflow。 - 浮點數 (
float):IEEE 754 雙精度、適合連續值與科學計算;須留意舍入誤差與比較問題。 - 型別轉換:
float()、int()、Decimal為常用工具,選對工具才能避免隱藏的錯誤。 - 最佳實踐:明確使用除法符號、避免直接比較浮點數、在金融領域使用
Decimal、適度控制大數運算的效能。
掌握了 int 與 float 的特性與限制,你就能在寫程式時自信地選擇最適合的數值型別,讓程式更正確、可維護且效能優化。祝你在 Python 的旅程中,玩得開心、寫得順利!