使用Python取得與顯示位數的方法|輕鬆操作整數與小數的實用指南

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

實用案例:取得位數的應用場景

以下是一些實際情況中會使用到位數取得的例子:

  1. 資料分析
  • 統計數值資料的位數,以便偵測異常值。
  1. 輸入驗證
  • 確認像是信用卡號或電話號碼等的位數是否正確。

範例:

# 驗證電話號碼的位數
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,需特別注意。

實用範例:數據格式化的應用

  1. 圖表與表格的顯示
  • 將數據以指定的小數位數顯示,可讓圖表或表格更加整齊易讀。
   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']
  1. 輸出到檔案
  • 在輸出至 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

實用案例:高精度計算的應用場景

  1. 金融計算
  • 例如利率計算、金額捨入等需要極高準確度的場景。
   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
  1. 科學運算
  • 適用於需要極高精度的科學或工程計算。

RUNTEQ(ランテック)|超実戦型エンジニア育成スクール

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 中操作數值的「位數」。以下將回顧各章節所學,並提供未來應用於實務的建議。

本文學到的重點

  1. 取得數值的位數:
  • 透過將整數或小數轉為字串,可以輕鬆計算其位數。
  • 學會了處理負數與非常大的數字時的技巧。
  1. 指定數值的顯示位數:
  • 使用 format() 函數與 f 字串來格式化數值。
  • 介紹了如何將數值四捨五入或截斷到特定的位數。
  1. 浮點數的精度與捨入注意事項:
  • 了解浮點數精度的限制,並學會使用 decimal 模組來避免誤差。
  1. 常見問題與實用範例:
  • 透過具體問答,釐清了常見疑問並掌握了實務應用的方法。

實務應用與下一步建議

  • 活用於資料分析與格式化:
    透過本篇文章所學的技巧,可以在進行資料分析或圖表建立時,更清楚地呈現數值資料。同時在輸出 CSV 或報表時,也能進行更精確的數據格式處理。
  • 提升程式碼品質:
    活用 Python 靈活的數值操作功能,寫出更有效率、可讀性更高的程式碼。特別是搭配 decimal 模組時,更能提升計算精度。
  • 進一步學習資源:
    建議參考 Python 官方文件與可信賴的技術網站,以持續深化您的知識。
  • Python 官方文件(日文)

給讀者的建議

  • 將本文章加入書籤:
    當需要快速查閱時,可立即參考這篇實用指南。
  • 閱讀更多相關文章:
    除了數值位數的操作外,也建議學習 Python 的基礎操作與進階技巧,以全面提升您的開發技能。