開始之前需要注意一點是:精度值為數字的總位數,如:1.23, 精度值為3; 0.123,精度值也為3
1、更改默認精度值后,直接進行計算即可保留對應精度值
from decimal import getcontext,Decimal getcontext().prec = 3 #設置精度值為3 f = 12.23435521 #type(f) : float value = Decimal(str(f)) #value: Decimal('12.23435521') #或:value = Decimal.from_float(f) print value*1 #Decimal('12.2') value = Decimal(1)/Decimal(3) print value #Decimal('0.333')
2、小數保留位數問題
from decimal import getcontext,Decimal f = 12.23435521 #type(f) : float value = Decimal(repr(f)).quantize(Decimal('0.000')) #保留3位小數,這里需要注意:在數字的精度值允許的范圍內 print value #12.234
3、取整問題
需要記住幾個參數:
ROUND_CEILING 總是趨向無窮大向上取整
ROUND_DOWN 總是趨向0取整
ROUND_FLOOR 總是趨向負無窮大向下取整
ROUND_HALF_DOWN 如果最后一個有效數字大於或等於5則朝0反方向取整;否則,趨向0取整
ROUND_HALF_EVEN 類似於ROUND_HALF_DOWN,不過,如果最后一個有效數字值為5,則會檢查前一位。偶數值會導致結果向下取整,奇數值導致結果向上取整
ROUND_HALF_UP 類似於ROUND_HALF_DOWN,不過如果最后一位有效數字為5,值會朝0的反方向取整
ROUND_UP 朝0的反方向取整
ROUND_05UP 如果最后一位是0或5,則朝0的反方向取整;否則向0取整
寫一個例子:
import decimal from decimal import getcontext,Decimal getcontext().prec = 1 getcontext().rounding = getattr(decimal, 'ROUND_CEILING') value = Decimal(1)/Decimal(8) print value # Decimal('0.2')