python系列教程64

朋友们,如需转载请标明出处: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')
我的微信公众号是“人工智能知识分享”

python系列教程64_第1张图片

你可能感兴趣的:(编程技术)