簡體   English   中英

Python十進制格式錯誤的行為?

[英]Python Decimal formatting wrong behavior?

我在嘗試使用'%。2f'格式化Decimal時嘗試獲取一致值。 然而,結果令我感到驚訝。 相同的十進制值,不同的舍入。 知道我做錯了什么嗎?

>>> from decimal import Decimal
>>> x = Decimal('111.1650')
>>> print '%.2f' % x
111.17
>>> y = Decimal('236.1650')
>>> print '%.2f' % y
236.16

謝謝

Python的百分比樣式格式化不理解Decimal對象:格式化時,隱式轉換為float。 碰巧的是,最接近可表示的二進制浮點數到你的x值是這樣的:

>>> print Decimal(float(x))
111.1650000000000062527760746888816356658935546875

這是一個比111.165中途案件更大的觸摸,因此它會向上111.165 同樣,對於y ,最終格式化的值是這樣的:

>>> print Decimal(float(y))
236.164999999999992041921359486877918243408203125

在這種情況下,為輸出格式化的值恰好低於中間值,因此它向下舍入。

要避免隱式轉換,可以使用.format格式化方法:

>>> "{0:.2f}".format(Decimal('111.1650'))
'111.16'
>>> "{0:.2f}".format(Decimal('236.1650'))
'236.16'

請注意,您仍然可能不喜歡所有結果:

>>> "{0:.2f}".format(Decimal('236.1750'))
'236.18'

默認情況下,這種格式化使用舍入到半舍入到舍入模式。 實際上,它從當前的Decimal上下文采用舍入模式,因此您可以這樣做:

>>> from decimal import getcontext, ROUND_HALF_UP
>>> getcontext().rounding=ROUND_HALF_UP
>>> "{0:.2f}".format(Decimal('236.1750'))
'236.18'
>>> "{0:.2f}".format(Decimal('236.1650'))  # Now rounds up!
'236.17'

作為一般性評論,能夠為用戶定義的類實現自定義格式是新式.format格式化方法相對於舊式基於%的格式的一個重大勝利。

你的問題是可重復的。 作為解決方法,您可以使用較新的庫。

    >>> '{0:.2f}'.format( Decimal('236.1650') )
    '236.16'
    >>> '{0:.2f}'.format( Decimal('111.1650') )
    '111.16'

發生這種情況是因為無法准確表示浮點值。 請參閱文檔浮點運算。

或者,為了告訴您發生了什么,請輸入:

>>> Decimal(111.1650)
Decimal('111.1650000000000062527760746888816356658935546875')
>>> Decimal(236.1650)
Decimal('236.164999999999992041921359486877918243408203125')

問題是在您的情況下浮點數不准確接近.005邊界。 你剛剛遇到的情況是,一個數字略高於.005(因此被剔除)而另一個數字稍微低於並且被淹沒。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM