syn*_*abs 4 python decimal rounding number-formatting
我在尝试使用'%.2f'格式化Decimal时尝试获取一致值.然而,结果令我感到惊讶.相同的十进制值,不同的舍入.知道我做错了什么吗?
>>> from decimal import Decimal
>>> x = Decimal('111.1650')
>>> print '%.2f' % x
111.17
>>> y = Decimal('236.1650')
>>> print '%.2f' % y
236.16
Run Code Online (Sandbox Code Playgroud)
谢谢
Python的百分比样式格式化不理解Decimal对象:格式化时,隐式转换为float.碰巧的是,最接近可表示的二进制浮点x值是这样的:
>>> print Decimal(float(x))
111.1650000000000062527760746888816356658935546875
Run Code Online (Sandbox Code Playgroud)
这比111.165中途的情况要大一些,所以它会更加圆润.同样,对于y,最终格式化的值是这样的:
>>> print Decimal(float(y))
236.164999999999992041921359486877918243408203125
Run Code Online (Sandbox Code Playgroud)
在这种情况下,为输出格式化的值恰好低于中间值,因此它向下舍入.
要避免隐式转换,可以使用.format格式化方法:
>>> "{0:.2f}".format(Decimal('111.1650'))
'111.16'
>>> "{0:.2f}".format(Decimal('236.1650'))
'236.16'
Run Code Online (Sandbox Code Playgroud)
请注意,您仍然可能不喜欢所有结果:
>>> "{0:.2f}".format(Decimal('236.1750'))
'236.18'
Run Code Online (Sandbox Code Playgroud)
默认情况下,这种格式化使用舍入到半舍入到舍入模式.实际上,它从当前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'
Run Code Online (Sandbox Code Playgroud)
作为一般性评论,能够为用户定义的类实现自定义格式是新式.format格式化方法相对于旧式格式化的一大胜利%.
| 归档时间: |
|
| 查看次数: |
260 次 |
| 最近记录: |