Python 有兩種核心數值型別:int(整數)與 float(浮點數),前者處理沒有小數的整數,後者處理帶小數點的數字。本文涵蓋兩者的建立方式、運算特性、型別轉換、精度陷阱,以及常見錯誤防呆,是掌握 Python 數值運算的必讀基礎。
本文目錄
什麼是 int 與 float?
int 是整數,float 是帶小數點的數字——就這麼簡單。在 Python 中,你不需要事先宣告型別,只要寫下 10 就是 int,寫下 10.0 就是 float。整數可以無限大(受記憶體限制),浮點數則使用 IEEE 754 雙精度標準,約有 15~17 位有效數字。兩者之間可以互相轉換,也能混合運算,但有些細節需要特別留意。
核心語法
# ── 範例 1:建立 int 與 float ──
a = 42 # int:整數,無小數點
b = 3.14 # float:浮點數,有小數點
c = 1_000_000 # int:底線可作為千分位分隔符,增加可讀性
d = 2.0 # float:雖然值看起來是整數,但型別是 float
print(type(a)) #
print(type(b)) #
print(type(c)) #
print(type(d)) #
# ── 範例 2:基本運算 ──
print(7 + 2) # 加法 → 9
print(7 - 2) # 減法 → 5
print(7 * 2) # 乘法 → 14
print(7 / 2) # 除法 → 3.5(Python 3 預設回傳 float)
print(7 // 2) # 整數除法(地板除)→ 3
print(7 % 2) # 取餘數 → 1
print(2 ** 10) # 次方 → 1024
# ── 範例 3:型別轉換(Type Conversion)──
x = int(3.9) # float → int,直接截去小數(不四捨五入)→ 3
y = float(5) # int → float → 5.0
z = int("123") # 字串 → int → 123(字串必須是合法數字)
print(x) # 3
print(y) # 5.0
print(z) # 123
# 四捨五入:使用 round()
pi = 3.14159
print(round(pi, 2)) # 指定保留 2 位小數 → 3.14
print(round(pi)) # 四捨五入至整數 → 3
Python 3 的
/除法永遠回傳 float,即使能整除也一樣(6 / 3 → 2.0)。若想要整數結果,請改用//(地板除)。這與 Python 2 的行為不同,初學者需特別注意。
規則與注意事項
| 規則 | ✅ 正確範例 | ❌ 錯誤範例 / 陷阱 |
|---|---|---|
| int 與 float 混合運算,結果為 float | 3 + 1.0 → 4.0 |
誤以為結果是 int |
/ 永遠回傳 float |
10 / 2 → 5.0 |
誤以為 10 / 2 → 5(int) |
int() 截去小數,不四捨五入 |
int(3.9) → 3 |
誤以為 int(3.9) → 4 |
| float 有精度限制 | 使用 round() 處理輸出 |
0.1 + 0.2 == 0.3 為 False |
| 大整數可用底線分隔提升可讀性 | 1_000_000 |
1,000,000(逗號是 tuple 語法!) |
常見錯誤與防呆
錯誤一:把字串誤當數字進行運算
# ❌ 錯誤寫法(TypeError:can only concatenate str not int to str)
num = input("請輸入數字:") # input() 永遠回傳字串
result = num + 10 # TypeError!
# ✅ 正確寫法:先轉型再運算
num = int(input("請輸入數字:"))
result = num + 10
print(result)
錯誤二:用 int() 轉換非數字字串
# ❌ 錯誤寫法(ValueError: invalid literal for int() with base 10: 'abc')
x = int("abc") # ValueError!
# ✅ 正確寫法:先確認是否為合法數字
s = "123"
if s.isdigit():
x = int(s)
print(x) # 123
錯誤三:float 精度誤差導致比較失敗
# ❌ 常見陷阱(結果為 False,非預期!)
print(0.1 + 0.2 == 0.3) # False(IEEE 754 浮點精度問題)
# ✅ 正確寫法:使用 round() 或 math.isclose()
import math
print(math.isclose(0.1 + 0.2, 0.3)) # True
print(round(0.1 + 0.2, 10) == 0.3) # True
進階用法
科學記號與極大 / 極小浮點數
# Python 支援科學記號表示法
a = 1.5e3 # 等同於 1500.0
b = 2.5e-4 # 等同於 0.00025
c = 1e10 # 等同於 10000000000.0
print(a) # 1500.0
print(b) # 0.00025
# 檢查 float 的極限
import sys
print(sys.float_info.max) # 約 1.7976931348623157e+308
print(sys.float_info.min) # 約 2.2250738585072014e-308
數值格式化輸出
# 使用 f-string 控制小數位數
price = 1234.5678
print(f"{price:.2f}") # 保留 2 位小數 → 1234.57
print(f"{price:,.2f}") # 加入千分位逗號 → 1,234.57
print(f"{price:>12.2f}") # 右對齊,總寬 12 字元 → ' 1234.57'
# 量化交易常用:計算損益
entry = 150.25
exit_price = 163.80
profit = (exit_price - entry) * 100 # 假設 100 股
print(f"損益:${profit:.2f}") # 損益:$1355.00
整除與取餘的實戰應用
# 判斷奇偶數
num = 42
if num % 2 == 0:
print(f"{num} 是偶數")
else:
print(f"{num} 是奇數")
# 將秒數換算成時分秒
total_seconds = 3725
hours = total_seconds // 3600 # 商 → 1 小時
minutes = (total_seconds % 3600) // 60 # 餘數再取商 → 2 分鐘
seconds = total_seconds % 60 # 最終餘數 → 5 秒
print(f"{hours}h {minutes}m {seconds}s") # 1h 2m 5s
🏮 煉金師小叮嚀
做量化策略時,我最常踩的坑就是 float 精度問題——比較兩個浮點數是否相等,直接用 == 常常出錯。後來我改用 math.isclose() 或在輸出前統一用 round() 處理,問題迎刃而解。另一個習慣是:涉及金錢計算時,優先考慮 decimal 模組,它能提供更精確的十進位運算,避免 IEEE 754 帶來的隱形誤差。
Tags
python