iT邦幫忙

2022 iThome 鐵人賽

DAY 14
0

Decimals

Decimals 是 Python 內建的模組,讓我們更方便的處理各種以 10 進位為基準的計算,來試試看吧!

import decimal
from decimal import Decimal

Decimalscontext 物件可以讓我們設定特別的近似和進位。

context 可以是全域,也可以是區域設定。

Global 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 設定啦!

Local 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

Rounding

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

好啦,我們明天見~


上一篇
Python 與浮點數(float):什麼是 banker rounding?
下一篇
Decimals: Constructors and Contexts
系列文
小青蛇變大蟒蛇——進階Python學起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言