
2.2 数字类型声明及基本运算
Python语言提供了整型、浮点型、复数类型3种数字类型。可以通俗地理解为,整型是不带小数点的整数,而浮点型是带小数点的小数。
2.2.1 整型
整型共有4种进制表示:十进制、二进制、八进制、十六进制。
(1)十进制整数。为默认情况,由0~9的数字组成,如12、23。
(2)二进制整数。由0和1组成。在Python中表示该数为二进制时需要在数字前面加0b或0B,如0b0、0b10等。
(3)八进制整数。由 0~7 的数字组成。在 Python 中表示该数为八进制时需要在数字前面加 0o 或 0O(第 1 个是数字 0,第 2 个是字母 o,大写或小写均可。以下均相同),如0o1、0O11等。
(4)十六进制整数。由0~9 的数字、a~f 的字母组成。在Python 中表示该数为十六进制时需要在数字前面加0x或0X,如0xbb、0x3d等。
在Python中的整型数据的精度并不像其他编程语言一样有一个明确的范围限制,从理论上来讲,它能存储多大的整型数据是由硬件结构来决定的,即由内存大小或者 CPU的运算范围来决定整数的范围。
因此,我们可以处理非常非常大的数字,这在其他的编程语言是无法想象的。这也是Python具有的一个特性。
2.2.2 浮点型
Python中的浮点型有2种表示形式:十进制表示和科学计数法表示。十进制表示法与数学中的实数表示法一致。如.1、1.1、0.1、1.0等都是合法的表示方法。1.1×10-2的科学计数法为1.1e-2或1.1E-2,e或E表示以10为底,后跟10的幂次方,其值为0.011。
2.2.3 复数类型
Python 中的复数类型表示数学中的复数。复数分为实部和虚部,其中,虚部通过 j或J来表示,如12.5+5j或12.5+5J。复数的实部和虚部都是浮点型。
对于复数z,可以用z.real和z.imag来分别获得它的实数部分和虚数部分。例如:

2.2.4 数字运算符
变量被赋值为数字类型后,可以进行数学中的加、减、乘、除等各种运算。
Python 提供大部分常用的算术运算符,如加、减、乘、除等。表 2-1 给出了常用的算术运算符。
表2-1 常用的算术运算符

运算符运算的结果可能会改变数字类型,3 种数字类型之间存在一种逐渐扩展的关系,具体如下:
整型→浮点型→复数类型
例如:

表2-1中所有运算符都有与之对应的增强赋值运算符。如果用op表示表2-1的运算符,则以下赋值操作等价。注意:运算符op和赋值号之间没有空格。
x op=y 等价于 x=x op y
使用增强赋值运算符简化了代码的表达。

2.2.5 数字类型的常用函数及math库
1.内置的数字运算函数
Python 提供了一些内置函数来完成特定的操作,与数字类型相关的内置数字运算函数如表2-2所示。
表2-2 与数字类型相关的内置数字运算函数

商余函数divmod(x,y)返回的是参数x和y整除及进行模运算之后得到的值组合形成的元组类型数据。

2.math库
下面来看一下浮点型数值的常见处理方式。

但如果我们想按照自己的方式来处理后面的小数,即希望把后面的小数部分去掉,就算是 3.99 也直接去掉后面的小数部分,该怎么办?这时可以使用一个模块,叫作“math”,它里面有些函数可以帮我们完成想要的操作。但它不是全局函数,需要加载相应的模块才能使用。导入math库的3种方法如下。
1)import math
采用这种形式导入math库后,对math库中函数的调用方式为:math.<函数名>()。

2)import math as<别名>
math库中函数的调用方式为:math.<别名>()。


3)from math import*
math库中函数的调用方式为:<函数名>()。

在math库中有很多写好的函数,或称为方法,可以用它来执行一些常见操作。
math库包括数学常数(见表2-3)、数值函数(见表2-4)、幂对数函数(见表2-5)等,更多内容请查阅相关文献。
表2-3 math库的数学常数

表2-4 math库的数值函数

表2-5 math库的幂对数函数

说明:Python 解释器的内部表示存在一个小数点后若干位的精度尾数,当进行浮点数的运算时,这个精度尾数可能会影响输出结果。因此,在进行浮点数运算及结果比较时,建议采用math库提供的函数而不是直接使用Python提供的运算符。
floor()和trunc()方法的区别如下。
floor():总是往左边取值,往小的方向取值。
trunc():总是往0方向取值。
与floor()方法取值相反的还有ceil(),其总是往上、往大的方向取值。
关于更多“math”模块下的函数,大家可以查询一些相关的文档,也可以通过 help命令进行查阅。

2.2.6 数字类型转换函数
Python 是一个强类型的语言,类型很重要。当两个不同类型的数据相加时,需要转换其中一个的类型,比如将带引号的"3"变成一个真正的十进制的整型数字,可以写成:

转换的工作由一个内置函数“int”来完成,内置函数是 Python 中已经内置好的,不需要额外地引入一些对象或模块、包就可以使用的函数。Python 中内置的数字转换函数如表2-6所示。
表2-6 内置的数字转换函数


之前在声明的时候通过加一个前缀来区分数的进制,现在转换的时候可以再加一个参数来告诉系统前面这个字符串的值是基于二进制的。依次类推,我们也可以转换八进制数、十六进制数。


函数complex更详细的用法请通过“help(complex)”命令进行查阅。
2.2.7 浮点型精度处理
之前在计算浮点数时,大多数情况下都能得到所期望的结果,但接下来我们看一个特殊情况。下面是一个有关浮点型数字计算的简单表达式。

尽管结果非常接近 0,但它不是 0。这在精度要求非常高的金融或财务领域是不能容忍的,因为这些领域一点点误差都不能有。
造成这个问题的根本原因在于,计算机内部的二进制存储机制本身就没办法存储某些特定的数值,但是在精度要求非常高的科学计算或金融财务领域,又不允许出现丝毫的误差,那该如何解决这个问题呢?
Python 提供了一个专门的模块“decimal”来解决有关浮点数的精度问题。通过decimal 模块下的类 Decimal(第一个字母大写),提供了一种精度更高的处理浮点型数字的机制。

注意:这里是将字符串'0.1'作为参数传递给 decimal 模块的类 Decimal 来构造函数,实际使用时经常会犯错,漏掉了'0.1'两边的引号。
如果想要以字符串的形式显示在页面或控制台上,可以通过将它赋值给一个变量,然后通过格式化的方式(后面将介绍格式化输出)或通过“str”转换一下再输出。


“import decimal”导入模块的方式,在使用 decimal 模块的每个类时都要带上前缀“decimal.”,这种方式有点烦琐,可以用如下方式来导入,从而可以有一种简化的表示方式:

其中,from decimal import decimal 表示从 Decimal 模块导入 Decimal 类。其语法为:

注意:浮点型的存储是有缺陷的,所以在精度要求更高的场合,可以使用 decimal模块的类 Decimal 来实现。但使用 decimal 模块的类 Decimal 传参数时一定要以字符串的形式进行传参。否则,如果直接传一个浮点型,它不会报错,但得不到我们想要的结果。
