1
Python编程从入门到实践
1.7.1.2 3.1.2 浮点数类型
3.1.2 浮点数类型

浮点数类型与数学中实数的概念一致,表示带有小数的数值。Python语言中的浮点数类型必须带有小数部分,小数部分可以是0。例如,1010是整数,1010.0是浮点数。

浮点数有两种表示方法:十进制形式的一般表示及科学计数法表示。除十进制外,浮点数没有其他进制表示形式。下面是浮点数类型的例子:

1011.0,-1011,1.01e3,-1.01E-3

科学计数法使用字母e或者E作为幂的符号,以10为基数,含义如下:

<a>e<b>=a×10b

上例中,1.01e3值为1010.0;-1.01E-3值为-0.00101。

Python浮点数类型的数值范围和小数精度受不同计算机系统的限制,一般来说,浮点数的数值范围为-10308~10308,浮点数之间的区分精度约为2.22×10-16。对于除高精度科学计算外的绝大部分运算来说,浮点数类型的数值范围和小数精度足够“可靠”,一般认为浮点数类型没有范围限制,如例3.2所示。

【例3.2】

1010是整数,1010.0是浮点数,它们的值相等,但进行幂运算的结果却可能不同。pow(x,y)是Python的内置函数,用来计算xy的值。例如,如例3.3所示,分别对整数和浮点数进行幂运算,可以看出,整数的运算精度比浮点数的更高。

【例3.3】

Python语言的浮点数运算存在一个“不确定尾数”问题,即两个浮点数运算,有一定概率在运算结果后增加一些“不确定尾数”,如例3.4所示。

【例3.4】

0.1+0.2的运算结果应该是0.3,但程序实际的结果是0.30000000000000004,多了一个尾数4。这不是计算机运行的错误,而是正常情况,这是为什么呢?

在计算机内部,使用二进制表示浮点数,0.1对应的二进制表示如下:

0.0001100110011001

受限于计算机表示浮点数使用的存储宽度,这个二进制数并不完全等于0.1,而是计算机所能表示的最接近0.1的二进制数。0.1+0.2的运算在计算机内部是最接近0.1和0.2两个数的加运算,因此,产生的数字接近0.3,但未必是最接近的,反映到十进制表示上,可能产生一个尾数,至于这个尾数具体是多少,计算机内部会根据二进制运算确定产生。然而,这个尾数是不确定的,本书称为“不确定尾数”。不确定尾数问题在其他编程语言中也会出现,这是程序设计语言的共性问题。

不确定尾数问题将会对浮点数运算结果的判断造成一定困扰,如例3.5所示。

【例3.5】

0.1+0.2的运算结果存在不确定尾数,与0.3是否相等的判断会出错。为了解决Python语言中不确定尾数问题,即将浮点数运算去掉不确定尾数,可以使用round()函数。

round(x,d)是一个四舍五入函数,能够对x进行四舍五入操作,其中参数d指定保留的小数位数,如例3.6所示。

【例3.6】

由于不确定尾数仅存在于浮点数运算的末尾,可以使用round()函数限定运算结果保留的位数,以去掉不确定尾数,并可以采用该运算结果与其他数值进行比较。如例3.7所示。

【例3.7】

在利用浮点数进行比较和运算时,结合实际情况考虑需要比较的精度,并使用round()函数进行位数控制再进行比较。这样的处理能够避免不确定尾数的干扰。