Python 浮點數 (float) 型別詳解:精度、運算、轉換與應用

Python 浮點數 (float) 型別詳解:精度、運算、轉換與應用 - CCC Blog
一個包含複雜數學公式和圖表的科學圖表,象徵著浮點數在科學計算中的應用。

在 Python 程式設計中,浮點數 (float) 是一種用於表示帶有小數部分的數字的資料型別。本文將深入探討 Python 浮點數的各個方面,包括定義、精度、表示方式、運算、型別轉換、特殊值,以及實際應用與注意事項。

什麼是浮點數 (float)?

浮點數是指帶有小數點的數字,可以用來表示分數、小數或非常大/非常小的數值。在 Python 中,浮點數屬於 float 型別。

# 浮點數範例
pi = 3.14159
price = 99.99
small_num = 0.000001
large_num = 1.23e10  # 科學記號表示法,等於 1.23 * 10^10

print(type(pi))  # 輸出: <class 'float'>
print(large_num) # 輸出: 12300000000.0

浮點數的精度與表示方式

由於電腦內部使用二進位表示數字,而大部分小數無法用有限位數的二進位精確表示,因此浮點數存在精度限制。這意味著某些小數在電腦中只能儲存為近似值。

表示方式上,除了常規的小數表示,還可以使用科學記號 (例如 1.23e-5,代表 1.23 * 10-5)。

重要觀念: 由於精度限制,浮點數的比較 (特別是相等性比較 ==) 是不可靠的。通常建議使用一個很小的誤差範圍 (tolerance) 來判斷兩個浮點數是否「足夠接近」。

# 浮點數精度範例
a = 0.1
b = 0.2
c = 0.3

print(f"0.1 + 0.2 = {a + b}")  # 輸出結果並非精確的 0.3
print(a + b == c)             # 輸出: False,這是一個常見的陷阱!

# 正確的比較方法:使用誤差範圍
tolerance = 1e-9  # 定義一個很小的數作為誤差容忍度
print(abs((a + b) - c) < tolerance)  # 輸出: True

浮點數的基本運算

Python 支援對浮點數進行各種數學運算,與整數類似:

  • 加法 (+), 減法 (-), 乘法 (*), 除法 (/): 基本四則運算,結果為浮點數。
  • 整數除法 (//): 相除後,結果為浮點數但無條件捨去小數部分 (例如 5.0 // 2.0 結果是 2.0)。
  • 取餘數 (%): 得到兩個浮點數相除的餘數。
  • 次方 (**): 計算一個浮點數的冪次方。
x = 2.5
y = 1.2

print(f"{x} + {y} = {x + y}")    # 輸出: 3.7
print(f"{x} - {y} = {x - y}")    # 輸出: 1.3
print(f"{x} * {y} = {x * y}")    # 輸出: 3.0
print(f"{x} / {y} = {x / y}")    # 輸出: 2.0833...
print(f"{x} // {y} = {x // y}")   # 輸出: 2.0
print(f"{x} % {y} = {x % y}")     # 輸出: 0.1
print(f"{x} ** {y} = {x ** y}")   # 輸出: 3.3219...

浮點數與其他型別的轉換

在不同資料型別間轉換是常見操作:

  • float(): 可以將整數、數字字串轉換為浮點數。
  • int(): 將浮點數轉換為整數 (無條件捨去小數部分)。
  • str(): 將浮點數轉換為字串。
# 將整數轉換為浮點數
int_num = 10
float_num_from_int = float(int_num)
print(f"float(10) -> {float_num_from_int}")  # 輸出: 10.0

# 將字串轉換為浮點數
str_num = "3.14"
float_num_from_str = float(str_num)
print(f"float('3.14') -> {float_num_from_str}")  # 輸出: 3.14

# 將浮點數轉換為整數 (無條件捨去小數)
float_num = 7.8
int_num_from_float = int(float_num)
print(f"int(7.8) -> {int_num_from_float}") # 輸出: 7

# 將浮點數轉為字串
float_num_to_str = 3.14
str_num_from_float = str(float_num_to_str)
print(f"str(3.14) is a {type(str_num_from_float)}") # 輸出: <class 'str'>

特殊浮點數值

Python 的浮點數標準 (IEEE 754) 包含了三個特殊值:

  • 正無窮大: float('inf')
  • 負無窮大: float('-inf')
  • 非數字 (Not a Number): float('nan'),表示未定義或無效的數值 (例如 0/0 的結果)。
import math

print(float('inf') > 1e100)        # 輸出: True
print(float('-inf') < -1e100)      # 輸出: True

# NaN 的一個奇特特性是它不等於任何值,包括它自己!
print(float('nan') == float('nan')) # 輸出: False

# 因此需要用 math.isnan() 來檢查
print(math.isnan(float('nan')))    # 輸出: True

浮點數的應用

浮點數在程式設計中主要用於以下場景:

  • 科學計算: 表示和計算物理量、數學公式等。
  • 金融計算: 表示貨幣金額、利率、匯率等。
  • 圖形學: 表示 2D/3D 座標、顏色值 (如 0.0 到 1.0 的範圍)。
  • 機器學習: 模型的權重參數、數據特徵等通常都是用浮點數表示。

總結

Python 的浮點數 (float) 型別是處理連續數值的基礎。雖然它存在二進位精度限制,但這也是所有現代程式語言的共同特性。透過使用誤差範圍進行謹慎比較,並了解其運算規則和特殊值,浮點數可以被廣泛且可靠地應用於各種科學計算、工程應用和數據分析場景。了解 float 的特性和限制,對於寫出正確、可靠的程式碼至關重要。

較新的 較舊