1. 程式人生 > >1.2 decimal模塊

1.2 decimal模塊

浮點數 整數 ima 運算 模運算 類型 返回 python 手工

1 >>> 0.1 + 0.1 +0.1 == 0.3
2 False
3 >>> 
4 >>> print(0.1 + 0.1 + 0.1)
5 0.30000000000000004

what???

0.1 + 0.1 +0.1 == 0.3 判斷為假
0.1 + 0.1 + 0.1 == 0.30000000000000004
可見Python中的浮點數的存儲是不精確的。為毛捏? 因為內置的二進制浮點數實現 float是不精確的,這是二進制的問題。 不過直觀地看上去,二進制浮點數與實際數值的差距很小。但金融應用、科學計算等需要精確十進制表達的場合就不行了,為了確保十進制數位精度,或者用戶希望計算結果與手算相符的場合。Decimal 重現了手工的數學運算。 高精度使 Decimal 可以執行二進制浮點數無法進行的模運算和等值測試。 下面正式進入decimal模塊的學習了。 第一步:國際慣例,想使用,先導入
from decimal import Decimal
第二步:使用它

>>> from decimal import Decimal
>>> Decimal(‘7.1‘) / Decimal(‘3.1‘)
Decimal(‘2.290322580645161290322580645‘)

這個demo中有3個知識點:

  (1)Decimal()的參數是字符串,如果不註意這一點,把浮點數作為參數傳遞進來,得到的結果還是不精確的

    >>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1)

    Decimal(‘0.3000000000000000166533453694‘)
    >>>
    >>> Decimal(1.2) + Decimal(1.8)
    Decimal(‘3.000000000000000000000000000‘)
    >>> Decimal(‘1.2‘) + Decimal(‘1.8‘)
    Decimal(‘3.0‘)
    >>>

  (2)計算結果返回的還是Decimal類型 ,可以用float()函數將其轉換為浮點數

      >>> a = Decimal(‘7.1‘) / Decimal(‘3.1‘)
      >>> float(a)
      2.2903225806451615

    Decimal類型能通過int()轉換為整型嗎?

      >>> b = Decimal(‘1.0‘) + Decimal(‘1.0‘)
      >>> int(b)
      2
      >>>
      >>> c = Decimal(‘1.0‘) + Decimal(‘1.1‘)
      >>> int(c)
      2 #哦,這樣啊,轉換成整數的時候是只取整數部分的,不試一下還真不知道

  (3)浮點型計算中經常會遇到的一個問題,兩數相除,但不能相除的情況

      >>> Decimal(‘2‘) / Decimal(‘3‘)

      Decimal(‘0.6666666666666666666666666667‘) #小數點後面這麽多位啊,可是要那麽多位沒什麽用啊,腫麽辦?

    可以事先自定義一下Decimal計算的精度

      >>> Decimal(‘1.0‘) / Decimal(‘3.0‘)

      Decimal(‘0.3333333333333333333333333333‘)
      >>>
      >>> from decimal import getcontext
      >>> getcontext().prec = 4
      >>> Decimal(‘1.0‘) / Decimal(‘3.0‘)
      Decimal(‘0.3333‘)
      >>>

1.2 decimal模塊