其他的数字类型——小数类型——小数基础

未匹配的标注

最后一点值得详述。和当探索比较时简要预览那样:浮点数学不那么准确,因为用来存储值的空间有限。比如,下面应该等于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倍。

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

上一篇 下一篇
讨论数量: 0
发起讨论 只看当前版本


暂无话题~