1. 前言
Python是一種擁有簡潔語法與強大功能的程式語言,深受眾多開發者喜愛。本文將介紹如何在Python中操作「位數」相關的技巧。掌握數值的位數取得與顯示控制,在資料處理與格式化等多種場景中都是非常實用的重要技能。
本文針對初學者到中階使用者,詳細說明如何取得整數與小數的位數,以及如何以指定的位數顯示資料。閱讀本篇文章後,您將能掌握在實務或專案中派得上用場的實用知識。
2. 如何在 Python 中取得數值的位數
取得數值位數的方法會根據資料是「整數」還是「小數」而有所不同。本章節將針對這兩種類型,分別舉例說明具體的操作方式。
取得整數的位數方法
基本方法
在 Python 中,可以使用 str()
函數將整數轉為字串,再透過 len()
函數計算字串長度,從而取得位數。
範例:
num = 12345
num_digits = len(str(num))
print(num_digits) # 輸出: 5
處理負數的方法
若數值為負數,則可先使用 abs()
函數取得絕對值,再計算其位數。
範例:
num = -12345
num_digits = len(str(abs(num)))
print(num_digits) # 輸出: 5
處理非常大的整數
Python 能處理非常大的整數,但當位數超過 4300 時,轉為字串時可能會遇到限制。這種情況下,可以使用 sys.set_int_max_str_digits()
來放寬限制。
範例:
import sys
sys.set_int_max_str_digits(0) # 取消限制
num = 10 ** 5000
print(len(str(num))) # 輸出: 5001
取得小數的位數方法
去除小數點後再計算
若要取得帶有小數點的數值總位數,可以先用 str()
轉換為字串,再使用 replace()
去除小數點,最後計算位數。
範例:
num = 123.456
num_digits = len(str(num).replace('.', ''))
print(num_digits) # 輸出: 6
僅計算數字字元
若只想統計字串中純數字的數量,可使用列表生成式(list comprehension)。
範例:
num = -123.456
num_digits = sum(c.isdigit() for c in str(num))
print(num_digits) # 輸出: 6
實用案例:取得位數的應用場景
以下是一些實際情況中會使用到位數取得的例子:
- 資料分析:
- 統計數值資料的位數,以便偵測異常值。
- 輸入驗證:
- 確認像是信用卡號或電話號碼等的位數是否正確。
範例:
# 驗證電話號碼的位數
phone_number = "08012345678"
if len(phone_number) == 11:
print("位數正確。")
else:
print("位數不正確。")
3. 如何在 Python 中指定數值的顯示位數
在 Python 中,可以透過指定顯示位數來調整數值的外觀,或保持所需的精度。本章節將介紹使用 format()
函數、f 字串(格式化字串)以及 round()
函數來進行數值格式化與四捨五入的技巧。
使用 format() 函數進行格式化
基本用法
使用 format()
函數時,可以指定小數點後的位數來格式化數值。
範例:
num = 3.14159
formatted_num = "{:.2f}".format(num)
print(formatted_num) # 輸出: 3.14
此範例中,數值會顯示到小數點後第 2 位。
動態指定顯示位數的方法
也可以將顯示位數設為變數,以動態調整格式。
範例:
num = 3.14159
precision = 3
formatted_num = "{:.{}f}".format(num, precision)
print(formatted_num) # 輸出: 3.142
透過變數 precision
的值,就能靈活地控制顯示的位數。
使用 f 字串(格式化字串)進行格式化
基本用法
從 Python 3.6 開始,可以使用更簡潔的 f 字串來格式化數值。
範例:
num = 3.14159
formatted_num = f"{num:.2f}"
print(formatted_num) # 輸出: 3.14
在 {num:.2f}
中指定小數點後顯示 2 位數。
動態指定位數的方法
使用 f 字串也可以搭配變數來動態設定位數。
範例:
num = 3.14159
precision = 4
formatted_num = f"{num:.{precision}f}"
print(formatted_num) # 輸出: 3.1416
使用 round() 函數進行四捨五入
基本用法
round()
函數可將數值四捨五入至指定的小數位數。
範例:
num = 3.14159
rounded_num = round(num, 2)
print(rounded_num) # 輸出: 3.14
注意偶數捨入(銀行家捨入)
round()
採用偶數捨入(又稱「銀行家捨入」),在某些情況下可能導致非直覺的結果。
範例:
num = 2.675
rounded_num = round(num, 2)
print(rounded_num) # 輸出: 2.67
如上例所示,2.675
被四捨五入成 2.67
而不是 2.68
,需特別注意。
實用範例:數據格式化的應用
- 圖表與表格的顯示:
- 將數據以指定的小數位數顯示,可讓圖表或表格更加整齊易讀。
data = [3.14159, 2.71828, 1.61803]
formatted_data = [f"{x:.2f}" for x in data]
print(formatted_data) # 輸出: ['3.14', '2.72', '1.62']
- 輸出到檔案:
- 在輸出至 CSV 或文字檔時,可以使用格式化後的數值。
with open("output.txt", "w") as file:
file.write(f"{3.14159:.2f}")
4. 關於浮點數精度與四捨五入的注意事項
在 Python 中處理數值時,必須注意浮點數的精度與四捨五入所可能引發的問題。本章節將說明浮點數的特性與限制,並介紹如何進行高精度計算的方法。
浮點數精度的限制
Python 中的浮點數是依照 IEEE 754 標準,以 64 位元的格式儲存。這會導致在某些情況下出現極小的誤差,讓計算結果不如預期。
範例:
result = 0.1 + 0.2
print(result) # 輸出: 0.30000000000000004
這類誤差源自浮點數在有限位元下無法精確表示某些十進位數值。
四捨五入時的注意事項
偶數捨入(銀行家捨入)
Python 的 round()
函數採用偶數捨入的方式,也就是所謂的「銀行家捨入法」。這可能會導致結果與直覺不符。
範例:
num = 2.675
rounded_num = round(num, 2)
print(rounded_num) # 輸出: 2.67
偶數捨入的意思是當尾數為 0.5 時,會將結果四捨五入到最接近的偶數。
如何進行高精度計算
使用 decimal 模組
透過 Python 的 decimal
模組,可以有效減少浮點誤差,進行更精確的數值計算。這個模組允許手動設定精度與捨入規則。
範例:
from decimal import Decimal, ROUND_HALF_UP
num = Decimal('2.675')
rounded_num = num.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(rounded_num) # 輸出: 2.68
透過指定 ROUND_HALF_UP
,可以進行傳統的四捨五入。
設定精度
decimal
模組也可設定全域精度,以進行更高位數的精密計算。
範例:
from decimal import Decimal, getcontext
getcontext().prec = 50 # 設定精度為 50 位
num = Decimal('1') / Decimal('3')
print(num) # 輸出: 0.33333333333333333333333333333333333333333333333333
實用案例:高精度計算的應用場景
- 金融計算:
- 例如利率計算、金額捨入等需要極高準確度的場景。
from decimal import Decimal, ROUND_DOWN
amount = Decimal('123.4567')
rounded_amount = amount.quantize(Decimal('0.01'), rounding=ROUND_DOWN)
print(rounded_amount) # 輸出: 123.45
- 科學運算:
- 適用於需要極高精度的科學或工程計算。

5. 常見問題(FAQ)
在使用 Python 操作數值位數時,初學者到中階使用者常常會遇到一些疑問。本章節整理了具體的問題與解答,幫助您更清楚地理解並解決實務上的困惑。
1. 如何在 Python 中建立固定位數的字串?
若想將數值轉為固定長度的字串,可以使用 zfill()
方法。這會在數值前補 0,直到達到指定的位數。
範例:
num = 42
fixed_length_str = str(num).zfill(5)
print(fixed_length_str) # 輸出: 00042
2. 如何在 Python 中將小數點以下的位數截斷?
若要截斷小數點後的位數,可以搭配 int()
函數或 math.floor()
函數使用。
範例:
num = 3.14159
truncated_num = int(num * 100) / 100
print(truncated_num) # 輸出: 3.14
也可以使用 decimal
模組,以更靈活的方式進行截斷:
from decimal import Decimal, ROUND_DOWN
num = Decimal('3.14159')
truncated_num = num.quantize(Decimal('0.01'), rounding=ROUND_DOWN)
print(truncated_num) # 輸出: 3.14
3. 在取得位數時發生錯誤的原因與解決方式?
常見錯誤的原因之一是傳入了非數值型別的資料。解決方法是使用 isinstance()
來事先檢查資料型別。
範例:
def get_digits(value):
if isinstance(value, (int, float)):
return len(str(abs(int(value))))
else:
raise ValueError("請提供數值型別的資料")
print(get_digits(12345)) # 輸出: 5
print(get_digits("字串")) # ValueError: 請提供數值型別的資料
4. 如何將數值四捨五入到特定的位數?
可以使用 round()
函數或 decimal
模組來達成。
範例:使用 round()
num = 2.675
rounded_num = round(num, 2)
print(rounded_num) # 輸出: 2.67
範例:使用 decimal
模組
from decimal import Decimal, ROUND_HALF_UP
num = Decimal('2.675')
rounded_num = num.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)
print(rounded_num) # 輸出: 2.68
5. 如何在 Python 中動態指定格式化的位數?
可透過 f 字串或 format()
函數,動態指定顯示的位數。
範例:使用 f 字串
num = 3.14159
precision = 3
formatted_num = f"{num:.{precision}f}"
print(formatted_num) # 輸出: 3.142
範例:使用 format()
函數
num = 3.14159
precision = 4
formatted_num = "{:.{}f}".format(num, precision)
print(formatted_num) # 輸出: 3.1416
6. 總結
本文詳細介紹了如何在 Python 中操作數值的「位數」。以下將回顧各章節所學,並提供未來應用於實務的建議。
本文學到的重點
- 取得數值的位數:
- 透過將整數或小數轉為字串,可以輕鬆計算其位數。
- 學會了處理負數與非常大的數字時的技巧。
- 指定數值的顯示位數:
- 使用
format()
函數與 f 字串來格式化數值。 - 介紹了如何將數值四捨五入或截斷到特定的位數。
- 浮點數的精度與捨入注意事項:
- 了解浮點數精度的限制,並學會使用
decimal
模組來避免誤差。
- 常見問題與實用範例:
- 透過具體問答,釐清了常見疑問並掌握了實務應用的方法。
實務應用與下一步建議
- 活用於資料分析與格式化:
透過本篇文章所學的技巧,可以在進行資料分析或圖表建立時,更清楚地呈現數值資料。同時在輸出 CSV 或報表時,也能進行更精確的數據格式處理。 - 提升程式碼品質:
活用 Python 靈活的數值操作功能,寫出更有效率、可讀性更高的程式碼。特別是搭配decimal
模組時,更能提升計算精度。 - 進一步學習資源:
建議參考 Python 官方文件與可信賴的技術網站,以持續深化您的知識。 - Python 官方文件(日文)
給讀者的建議
- 將本文章加入書籤:
當需要快速查閱時,可立即參考這篇實用指南。 - 閱讀更多相關文章:
除了數值位數的操作外,也建議學習 Python 的基礎操作與進階技巧,以全面提升您的開發技能。