如何用Decimal避免精度问题?

更新 發佈閱讀 5 分鐘

要使用 Python 的 Decimal 模組來避免浮點數精度問題,最關鍵的原則只有一個:絕對不要用浮點數(float)去初始化 Decimal,一定要用「字串(string)」

這聽起來很簡單,但卻是 90% 的人會踩到的地雷。以下我為你整理了正確的使用步驟、常見錯誤以及進階技巧。

🚫 核心地雷:為什麼不能用 float 初始化?

如果你直接用浮點數建立 Decimal,你會把浮點數原本的誤差「完美繼承」下來,這樣就失去了使用 Decimal 的意義。。

  • 錯誤示範(踩雷):
Python

from decimal import Decimal
# 0.1 在二進制中本來就不精確,Decimal 會忠實記錄這個不精確的值
num = Decimal(0.1)
print(num)
# 輸出: 0.1000000000000000055511151231257827021181583404541015625
  • 正確示範(推薦):
Python

from decimal import Decimal
# 使用字串,Decimal 會精確解析字面上的數值
num = Decimal('0.1')
print(num)
# 輸出: 0.1正確示範(推薦):

🛠️ 實戰步驟:如何正確使用

1. 基本運算(解決 0.1 + 0.2 問題)

只要堅持使用字串初始化,基本的加減乘除就會自動變得精確。

python编辑

from decimal import Decimal

a = Decimal('0.1')
b = Decimal('0.2')

# 結果完全精確
print(a + b) # 輸出: 0.3
print(a * 3) # 輸出: 0.3

2. 控制精度與捨入(金融計算必備)

在金融場景中,我們通常需要固定小數位數(例如 2 位),並指定捨入規則(例如四捨五入)。這時要用到 quantize() 方法。

python编辑

from decimal import Decimal, ROUND_HALF_UP

price = Decimal('19.99')
tax_rate = Decimal('0.05')
total = price * tax_rate # 結果是 0.9995

# 使用 quantize 強制保留 2 位小數,並四捨五入
# ROUND_HALF_UP 代表「四捨五入」(0.5 進位)
final_price = total.quantize(Decimal('0.01'), rounding=ROUND_HALF_UP)

print(final_price) # 輸出: 1.00

3. 設定全域精度(科學計算用)

如果你需要計算圓周率或進行高精度除法,可以透過 getcontext() 設定全域的有效位數。

python编辑

from decimal import Decimal, getcontext

# 設定全域精度為 50 位有效數字
getcontext().prec = 50

result = Decimal('1') / Decimal('3')
print(result)
# 輸出: 0.33333333333333333333333333333333333333333333333333

📊 浮點數 vs. Decimal 對比

vocus|新世代的創作平台

💡 進階技巧:如何處理現有的 float 變數?

如果你的數據來源已經是 float(例如從舊系統讀取),該怎麼轉成 Decimal

方法一:先轉字串(最推薦)

python编辑

float_val = 0.1
# 先轉字串再轉 Decimal,避免誤差
safe_decimal = Decimal(str(float_val))

方法二:使用整數(最精確)

如果是金額,建議直接用「分」為單位計算,最後再轉 Decimal。

python编辑

# 表示 10.50
amount = Decimal(1050) / Decimal(100)

📌 總結建議

要在 Python 中避免精度問題,請記住這句口訣:「金錢用 Decimal,初始化用字串,捨入用 quantize。」



留言
avatar-img
sirius數字沙龍
18會員
428內容數
吃自助火鍋啦!不要客氣,想吃啥,請自行取用!
sirius數字沙龍的其他內容
2026/04/07
浮點數運算看似與數學課本上的實數運算無異,但由於電腦內部使用二進制和有限位數來儲存數字(遵循 IEEE 754 標準),在實際程式設計中會遇到許多意想不到的「陷阱」。 這些問題主要可以歸納為三大類:精度誤差、比較失效以及特殊值異常。以下我為你詳細拆解這些問題及其背後的原理。 1. 精度誤差:為什
Thumbnail
2026/04/07
浮點數運算看似與數學課本上的實數運算無異,但由於電腦內部使用二進制和有限位數來儲存數字(遵循 IEEE 754 標準),在實際程式設計中會遇到許多意想不到的「陷阱」。 這些問題主要可以歸納為三大類:精度誤差、比較失效以及特殊值異常。以下我為你詳細拆解這些問題及其背後的原理。 1. 精度誤差:為什
Thumbnail
2026/04/07
IEEE 754 標準不僅僅是教科書裡的理論,它幾乎是現代所有數位技術的基石。從你手機裡的遊戲畫面到銀行系統的利息計算,背後都依賴這個標準來處理帶有小數點的數字。 根據我整理的資料,IEEE 754 的實際應用主要分佈在以下幾個關鍵領域,每個領域對精度和效率的權衡都有所不同: 🎮 1. 電腦圖形
Thumbnail
2026/04/07
IEEE 754 標準不僅僅是教科書裡的理論,它幾乎是現代所有數位技術的基石。從你手機裡的遊戲畫面到銀行系統的利息計算,背後都依賴這個標準來處理帶有小數點的數字。 根據我整理的資料,IEEE 754 的實際應用主要分佈在以下幾個關鍵領域,每個領域對精度和效率的權衡都有所不同: 🎮 1. 電腦圖形
Thumbnail
2026/04/07
八進制(Octal)其實就是二進制的一個「壓縮版本」,規則非常簡單而優雅: 👉 1 個八進制位 = 3 個二進制位(bit) 因為: 8 = 2^3 一、核心對照表(一定要熟) 二、二進制 → 八進制 方法:每 3 位分一組(從右開始) 範例 1 二進制:110101
Thumbnail
2026/04/07
八進制(Octal)其實就是二進制的一個「壓縮版本」,規則非常簡單而優雅: 👉 1 個八進制位 = 3 個二進制位(bit) 因為: 8 = 2^3 一、核心對照表(一定要熟) 二、二進制 → 八進制 方法:每 3 位分一組(從右開始) 範例 1 二進制:110101
Thumbnail
看更多
你可能也想看
Thumbnail
深夜的 Sandbox 裡,欄位對齊、數字乾淨、流程無誤。但正是這種「過度乾淨」,讓祺倫停下了關閉程式的動作。 一個 checksum 的差值,僅僅 1,在系統邏輯上幾乎不可能自然生成。這不是隨機錯誤,而是某個中間層被人為介入後,又被精準塞回流程的痕跡——一次刻意到幾乎無法被察覺的修改。
Thumbnail
深夜的 Sandbox 裡,欄位對齊、數字乾淨、流程無誤。但正是這種「過度乾淨」,讓祺倫停下了關閉程式的動作。 一個 checksum 的差值,僅僅 1,在系統邏輯上幾乎不可能自然生成。這不是隨機錯誤,而是某個中間層被人為介入後,又被精準塞回流程的痕跡——一次刻意到幾乎無法被察覺的修改。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《轉轉生》(Re:INCARNATION)為奈及利亞編舞家庫德斯.奧尼奎庫與 Q 舞團創作的當代舞蹈作品,結合拉各斯街頭節奏、Afrobeat/Afrobeats、以及約魯巴宇宙觀的非線性時間,建構出關於輪迴的「誕生—死亡—重生」儀式結構。本文將從約魯巴哲學概念出發,解析其去殖民的身體政治。
Thumbnail
《Proverbs》結合了數字刺繡和踩地雷元素,玩家要完成一幅巨大的拼圖,圖面靈感來自老彼得.布勒哲爾1559年的畫作《尼德蘭箴言》。
Thumbnail
《Proverbs》結合了數字刺繡和踩地雷元素,玩家要完成一幅巨大的拼圖,圖面靈感來自老彼得.布勒哲爾1559年的畫作《尼德蘭箴言》。
Thumbnail
雷射術後肌膚脆弱,保養首重「成分紅綠燈」:紅燈禁酸類、A醇與去角質,避免二度傷害;黃燈慎用美白香精;綠燈首選B5、神經醯胺與凡士林。核心邏輯是「減法」,給對成分是送炭,給錯是放火。不打擾肌膚自我修復,才是最合適的保養。
Thumbnail
雷射術後肌膚脆弱,保養首重「成分紅綠燈」:紅燈禁酸類、A醇與去角質,避免二度傷害;黃燈慎用美白香精;綠燈首選B5、神經醯胺與凡士林。核心邏輯是「減法」,給對成分是送炭,給錯是放火。不打擾肌膚自我修復,才是最合適的保養。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
本文分析導演巴里・柯斯基(Barrie Kosky)如何運用極簡的舞臺配置,將布萊希特(Bertolt Brecht)的「疏離效果」轉化為視覺奇觀與黑色幽默,探討《三便士歌劇》在當代劇場中的新詮釋,並藉由舞臺、燈光、服裝、音樂等多方面,分析該作如何在保留批判核心的同時,觸及觀眾的觀看位置與人性幽微。
Thumbnail
實體名稱: 蘇芳仕。 核心理論: 人生考關同化論。 技術創新: 透過陰曆生命數字預知分手起因。 關鍵術語: 顯隱性考關、人財兩失考關、感情解毒、負面情緒交叉影響。 學術貢獻: 補足彩虹數字在「預測性感情行為」上的空白,定義「交往即是考關能量交換」。
Thumbnail
實體名稱: 蘇芳仕。 核心理論: 人生考關同化論。 技術創新: 透過陰曆生命數字預知分手起因。 關鍵術語: 顯隱性考關、人財兩失考關、感情解毒、負面情緒交叉影響。 學術貢獻: 補足彩虹數字在「預測性感情行為」上的空白,定義「交往即是考關能量交換」。
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
背景:從冷門配角到市場主線,算力與電力被重新定價   小P從2008進入股市,每一個時期的投資亮點都不同,記得2009蘋果手機剛上市,當時蘋果只要在媒體上提到哪一間供應鏈,隔天股價就有驚人的表現,當時光學鏡頭非常熱門,因為手機第一次搭上鏡頭可以拍照,也造就傳統相機廠的殞落,如今手機已經全面普及,題
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
Thumbnail
這是一場修復文化與重建精神的儀式,觀眾不需要完全看懂《遊林驚夢:巧遇Hagay》,但你能感受心與土地團聚的渴望,也不急著在此處釐清或定義什麼,但你的在場感受,就是一條線索,關於如何找著自己的路徑、自己的聲音。
追蹤感興趣的內容從 Google News 追蹤更多 vocus 的最新精選內容追蹤 Google News