朋友们,如需转载请标明出处:https://blog.csdn.net/jiangjunshow
声明:在人工智能技术教学期间,不少学生向我提一些python相关的问题,所以为了让同学们掌握更多扩展知识更好地理解AI技术,我让助理负责分享这套python系列教程,希望能帮到大家!由于这套python教程不是由我所写,所以不如我的AI技术教学风趣幽默,学起来比较枯燥;但它的知识点还是讲到位的了,也值得阅读!PS:看不懂本篇文章的同学请先看前面的文章,循序渐进每天学一点就不会觉得难了!
Python 2.4引入了一种新的核心数据类型:小数对象。比其他数据类型复杂一些,小数是通过一个导入的模块调用函数后创建的,而不是通过运行常量表达式创建的。从功能上来说,小数对象就像浮点数,只不过它们有固定的位数,因此小数是有固定的精度的浮点值。
例如,使用了小数对象,我们能够使用一个只保留两位小数位精度的浮点数。此外,我们能够定义如何省略和截断额外的小数数字。尽管它对平常的浮点数类型来说带来了微小的性能损失,小数类型对表现固定精度的特性(例如,钱的总和)以及对实现更好的数字精度是一个理想的工具。
你可能已经知道,也可能还不知道:浮点数缺乏精确性,因为用来存储数值的空间有限。例如,下面的计算应该得到零,但是结果却没有。结果接近零,但是却没有足够的位数去实现这样的精度:
>>> 0.1 + 0.1 + 0.1 - 0.3
5.5511151231257827e-17
打印结果将会产生一个用户友好的显示格式但并不能完全解决问题,因为与硬件相关的浮点数运算在精度方面有内在的缺陷:
>>> print(0.1 + 0.1 + 0.1 - 0.3)
5.55111512313e-17
如果使用小数对象,结果能够改正:
>>> from decimal import Decimal
>>> Decimal('0.1') + Decimal('0.1') + Decimal('0.1') - Decimal('0.3')
Decimal('0.0')
正如这里显示的,我们能够通过调用在decimal模块中的Decimal的构造函数创建一个小数对象,并传入一个字符串,这个字符串有我们希望在结果中显示的小数位数。当不同精度的小数在表达式中混编时,Python自动升级为小数位数最多的:
>>> Decimal('0.1') + Decimal('0.10') + Decimal('0.10') - Decimal('0.30')
Decimal('0.00')
注意:在Python 3.1中,将能够从一个浮点对象创建一个小数对象,通过decimal.Decimal.from_float(1.25)形式的调用。这一转换是精确的,但有时候会产生较多的位数。
decimal模块中的其他工具可以用来设置小数数值的精度、设置错误处理等。例如,这个模块中的一个上下文对象允许指定精度(小数位数)和舍入模式(舍去、进位等):
>>> import decimal
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1428571428571428571428571429')
>>> decimal.getcontext().prec = 4
>>> decimal.Decimal(1) / decimal.Decimal(7)
Decimal('0.1429')
这对于处理货币的应用程序特别有用,其中,美分表示为两个小数位数。在这个上下文里,小数实际上是手动舍入和字符串格式化的一种替代方式:
>>> 1999 + 1.33
2000.3299999999999
>>>
>>> decimal.getcontext().prec = 2
>>> pay = decimal.Decimal(str(1999 + 1.33))
>>> pay
Decimal('2000.33')
在Python 2.6和Python 3.0(及其以后的版本中),可使用上下文管理器语句来重新设置临时精度。在语句退出后,精度又重新设置为初始值:
C:\misc> C:\Python30\python
>>> import decimal
>>> decimal.Decimal('1.00') / decimal.Decimal('3.00')
Decimal('0.3333333333333333333333333333')
>>>
>>> with decimal.localcontext() as ctx:
... ctx.prec = 2
... decimal.Decimal('1.00') / decimal.Decimal('3.00')
...
Decimal('0.33')
>>>
>>> decimal.Decimal('1.00') / decimal.Decimal('3.00')
Decimal('0.3333333333333333333333333333')