Decimals
是 Python 內建的模組,讓我們更方便的處理各種以 10 進位為基準的計算,來試試看吧!
import decimal
from decimal import Decimal
Decimals
的 context
物件可以讓我們設定特別的近似和進位。
context
可以是全域,也可以是區域設定。
g_ctx = decimal.getcontext()
g_ctx.prec
28
g_ctx.rounding
'ROUND_HALF_EVEN'
我們可以更改全域的設定:
g_ctx.prec = 6
g_ctx.rounding = decimal.ROUND_HALF_UP
檢查看看是否有成功修改 context
設定:
decimal.getcontext().prec
6
decimal.getcontext().rounding
'ROUND_HALF_UP'
ROUND_HALF_UP
就是我們常用的四捨五入,成功修改 global 的 context
設定啦!
localcontext()
會回傳一個 context manager
,我們可以搭配 with
使用:
with decimal.localcontext() as ctx:
print(ctx.prec)
print(ctx.rounding)
6
ROUND_HALF_UP
如果呼叫 localcontext()
時沒有傳 context
進去,預設是複製一個 global 的 context
設定給你:
不論對 local context
做什麼,都不會影響到 global context
:
with decimal.localcontext() as ctx:
ctx.prec = 10
print('local prec = {0}, global prec = {1}'.format(ctx.prec, g_ctx.prec))
local prec = 10, global prec = 6
decimal.getcontext().rounding
'ROUND_HALF_UP'
因為我們之前修改過 global 的 context
設定所以是 ROUND_HALF_UP,我們把它改回預設的 ROUND_HALF_EVEN:
decimal.getcontext().rounding = decimal.ROUND_HALF_EVEN
x = Decimal('1.25')
y = Decimal('1.35')
print(round(x, 1))
print(round(y, 1))
1.2
1.4
再把 global context 改回 ROUND_HALF_UP 看看:
decimal.getcontext().rounding = decimal.ROUND_HALF_UP
x = Decimal('1.25')
y = Decimal('1.35')
print(round(x, 1))
print(round(y, 1))
1.3
1.4
可以想見,如果你一直修改 global context,可能到最後你也忘記還原預設值,也忘了自己改成什麼。
所以一般來說修改 local context 會更好。
decimal.getcontext().rounding = decimal.ROUND_HALF_EVEN
x = Decimal('1.25')
y = Decimal('1.35')
print(round(x, 1), round(y, 1))
with decimal.localcontext() as ctx:
ctx.rounding = decimal.ROUND_HALF_UP
print(round(x, 1), round(y, 1))
print(round(x, 1), round(y, 1))
1.2 1.4
1.3 1.4
1.2 1.4
好啦,我們明天見~