其他的数字类型——小数类型——全局地设置小数精度

未匹配的标注

decimal模块中的其他工具能被用来设置所有小数的精度,配置错误处理等等。比如,在这个模块中的上下文对象允许指定精度(小数位数)和四舍五入模式(向下,向上等)。精度被全局地应用到调用线程中创建的所有小数:

>>> import decimal
>>> decimal.Decimal(1) / decimal.Decimal(7) # 默认精度: 28 个有效数位(不包括第一个0和小数点)
Decimal('0.1428571428571428571428571429')
>>> decimal.getcontext().prec = 4 # 固定精度
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')
>>> Decimal(0.1) + Decimal(0.1) + Decimal(0.1) - Decimal(0.3) # 接近0
Decimal('1.110E-17')

这对金融应用程序特别有用,在那里美分被表示为两个小数位数。在这个上下文中,小数本质上是手动四舍五入和字符串格式化的一个替代方案:

>>> 1999 + 1.33 # 在3.3版本中,这个结果在内存中的位数比显示的更多
2000.33
>>>
>>> decimal.getcontext().prec = 2
>>> pay = decimal.Decimal(str(1999 + 1.33))
>>> pay
Decimal('2000.33')

译注:上面这个例子不太合理,因为 1999 + 1.33 是一个表达式,其结果是一个浮点数,本身就可能出现浮点数的不准确问题,假如在这里的表达式中将 1999 + 1.33 改为 .1 + .1 + .1 - .3,那么就算使用了上面的方法,最终出现的Decimal是Decimal('5.551115123125783E-17'),仍然不是2位有效位数。所以可以推断:要想这个结论有效,前提是decimal.Decimal中的参数是数字或数字的字符串,而不是一个计算表达式或其字符串。

本文章首发在 LearnKu.com 网站上。

上一篇 下一篇
讨论数量: 0
发起讨论 查看所有版本


暂无话题~