iT邦幫忙

2022 iThome 鐵人賽

DAY 15
0

今天我們繼續來認識 Decimal
Decimal constructor 接受許多種資料類型:

import decimal
from decimal import Decimal

比如整數

Decimal(10)
Decimal('10')
Decimal(-10)
Decimal('-10')

也可以傳入字串

Decimal('0.1')
Decimal('0.1')
Decimal('-3.1415')
Decimal('-3.1415')

甚至可以傳入 Tuple

Decimal ((0, (3,1,4,1,5), -4))
Decimal('3.1415')
Decimal((1, (1,2,3,4), -3))
Decimal('-1.234')
Decimal((0, (1,2,3), 3))
Decimal('1.23E+5')

Tuple 的第一個變數代表正負(0正1負),中間的 tuple 代表數字每個位數的值,最後的變數代表 10 的N次方。
Decimal((0, (1,2,3), 3)) 代表 123 * 10^3 = 123000 = 1.23E+5

不過,不要傳 Floats!

format(0.1, '.25f')
'0.1000000000000000055511151'
Decimal(0.1)
Decimal('0.1000000000000000055511151231257827021181583404541015625')

觀察上面例子可以發現,因為大多數 float 是估計值,傳入 Decimal 反而完整的存下了這個估計值,而不是我們真正想要的精確小數。

使用 string 代替 float 傳入 Decimal

Context Precision

Context precision 作用不是設定 Decimal 物件創建時的精細度,而是影響數學運算時的精細度。

decimal.getcontext().prec = 2

我們創建小數點後五位的 Decimal 物件:

a = Decimal('0.12345')
b = Decimal('0.12345')
a
Decimal('0.12345')
b
Decimal('0.12345')

仍然是五位小數,但當我們對它們做加法時,context precision 就會發生作用:

a+b
Decimal('0.25')

運算的結果近似到小數點後兩位 (precision = 2)。

好啦,我們明天見~

參考:Python 3: Deep Dive (Part 1 - Functional)


上一篇
Python 與十進位——使用 Decimals
下一篇
Decimals 的數學運算
系列文
小青蛇變大蟒蛇——進階Python學起來!30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言