Python 的百分比样式格式不理解 Decimal 对象:当您格式化时,会隐式转换为浮点数。碰巧最接近您的x 值的可表示二进制浮点数是这样的:
>>> print Decimal(float(x))
111.1650000000000062527760746888816356658935546875
这比 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 格式方法相对于旧式基于 % 格式的一大胜利。