其他的数字类型——小数类型——小数基础 | 第二部分 类型与操作 —— 第 5 章: 数字类型 |《学习 python:强大的面向对象编程(第 5 版)》| python 技术论坛-380玩彩网官网入口
最后一点值得详述。和当探索比较时简要预览那样:浮点数学不那么准确,因为用来存储值的空间有限。比如,下面应该等于0,但却不是。结果接近0,但位数不够导致无法精确:
>>> 0.1 0.1 0.1 - 0.3 # python 3.3
5.551115123125783e-17
在python的3.1和2.7版本之前,打印结果来产生用户友好显示格式的办法也完全没有帮助,因为跟浮点数学有关的硬件在准确性(也就是精度)方面是天生受限的。下面在3.3版本中给出的和前面输出一样的结果:
>>> print(0.1 0.1 0.1 - 0.3) # pythons < 2.7, 3.1
5.55111512313e-17
然而,使用小数,结果可以完全准确:
>>> from decimal import decimal
>>> decimal('0.1') decimal('0.1') decimal('0.1') - decimal('0.3')
decimal('0.0')
这里显示:通过调用在decimal
模块中的decimal
构造函数和传入具有结果对象所需小数数位的字符串(如果需要,使用str
函数将浮点值转换为字符串),可以创建小数对象。当不同精度的小数被混合在表达式中时,python自动转换到最大的小数数位:
>>> decimal('0.1') decimal('0.10') decimal('0.10') - decimal('0.30')
decimal('0.00')
在python 2.7,3.1和之后版本,使用形式decimal.from_float(1.25)
这个调用,也可以从浮点对象创建小数对象,而且最新版本的python允许直接使用浮点数。这个转换是精确的但有时会产生一个大的默认数位(28位),除非它们根据下一章中的方法固定:
>>> decimal(0.1) decimal(0.1) decimal(0.1) - decimal(0.3)
decimal('2.775557561565156540423631668e-17')
在python 3.3和之后版本中,小数模块也被极大地优化来提高性能:新版本的速度根据评分测试的程序类型,提升了据说10倍到100倍。