[英]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.