数字包括整型数字和浮点型数字,是最常用的基本数据类型之一。
整型数字
【Excel VBA】
Excel VBA中,整型数字有短整型和长整型之分。短整型变量的取值范围为-32768~32767(-2^15~-2^15-1),长整型变量的取值范围为-2^63~2^63 -1。示例文件的存放路径为Samples\ch02\Excel VBA\数字类型.xlsm。
下面创建一个短整型变量intA并给它赋值。
Dim intA As Integer
intA=10
下面创建一个长整型变量lngB并给它赋值。
Dim lngB As Long
lngB=100
给变量赋的值超出其取值范围时,运行时会触发溢出错误。下面给短整型变量intA赋值1000000,超出了短整型变量的取值范围。
Dim intA As Integer
intA=1000000
运行程序,弹出消息框,提示发生了溢出错误。
【Python】
整型数字即整数,没有小数点,可有正负之分。Python 3中的整型没有短整型和长整型之分。
>>> a=10
>>> a
10
>>> b=-100
>>> b
-100
Python中整型值没有大小限制,可以表示很大的数,不会溢出,例如:
>>> c=99999999999999999999999
>>> c
99999999999999999999999
为了提高代码的可读性,可以给数字增加下划线作为分隔符,例如:
>>> d=123_456_789
>>> d
123456789
可以用十六进制或八进制表示整数。常用十六进制整数表示颜色,比如可用0x0000FF表示红色:
>>> e=0x0000FF
>>> e
255
浮点型数字
【Excel VBA】
Excel VBA中,浮点型数字有单精度浮点型和双精度浮点型之分。单精度浮点型变量的取值范围为-3.40E+38~+3.40E+38(-2^128~+2^128),双精度浮点型变量的取值范围为-1.79E+308~+1.79E+308(-2^1024~+2^1024)。示例文件的存放路径为Samples\ch02\Excel VBA\数字类型.xlsm。
下面创建一个单精度浮点型变量sngA并给它赋值。
Dim sngA As Single
sngA=10.123
下面创建一个双精度浮点型变量dblB并给它赋值。
Dim dblB As Double
dblB=100.123
【Python】
Python 3中,浮点型数字没有单精度浮点型和双精度浮点型之分。浮点型数字带小数,可以有十进制和科学计数法两种表示形式。比如31.415这个浮点数可以表示为:
>>> a=31.415
>>> a
31.415
或
>>> a=3.1415e1
>>> a
31.415
注意,科学计数法返回的数字是浮点型的,即使字母e前面是整数也是这样。
>>> b=1e2 #100
>>> type(b)
<class 'float'>
整数和浮点数混合运算时,计算结果为浮点型,例如下面计算一个整数和一个浮点数的和:
>>> a=10
>>> b=1.123
>>> c=a+b
>>> type(c)
<class 'float'>
复数
Python支持复数。复数由实部和虚部组成,可以用a+bj或者complex(a,b)表示。复数的实部a和虚部b都是浮点型数字。
下面创建几个复数变量:
>>> a=1+2j
>>> a
(1+2j)
>>> type(a)
<class 'complex'>
>>> b=-3j
>>> b
(-0-3j)
>>> c=complex(2,-1.2)
>>> c
(2-1.2j)
>>> type(c)
<class 'complex'>
其中变量b表示的复数只有虚部,实部自动设置为0。
类型转换有关的问题
【Excel VBA】
Excel VBA中进行数据类型转换时有可能导致两个问题,一个是高精度向低精度转换时失去精度的问题,另一个是计算过程中溢出的问题。
Excel VBA中高精度向低精度转换,变量会失去部分精度。下面的例子演示变量从浮点型向整型转换。示例文件的存放路径为Samples\ch02\Excel VBA\浮点型转整型.xlsm。
Dim intA As Integer
Dim dblB As Double
dblB = 10.789
intA = dblB
Debug.Print intA
运行程序,在立即窗口中输出11,说明浮点型转换为整型时小数部分采用四舍五入进行取整。
不同精度的变量进行四则运算时,返回的是高精度的计算结果。下面的代码中,短整型变量intA和长整型变量lngD相加,返回的结果为长整型。将结果赋给短整型变量intC时进行隐式变换。示例文件的存放路径为Samples\ch02\Excel VBA\数字类型.xlsm。
Dim intA As Integer
Dim intC As Integer
Dim lngD As Long
intA=999
lngD=99999
intC=intA+lngD
运行程序,由于intA和lngD相加的结果超出了短整型变量的取值范围,发生溢出错误。此时可以通过将intC声明为长整型来解决,即:
Dim intC As Long
【Python】
Python中浮点型转换为整型时直接将小数部分去掉,而不是进行四舍五入。
>>> e=1.678 #浮点数转换为整数
>>> f=int(e)
>>> f
1
>>> type(f)
<class 'int'>
可见,浮点数1.678转换为整型数字后变成了1,小数部分直接去掉了,与Excel VBA中的四舍五入不同。
Python的整数缓存机制
在命令行模式下,Python对范围在[-5,256]内的整数对象进行缓存。这些比较小的整数被使用的频率比较高,如果不进行缓存,每次使用它们的时候都要进行分配内存和释放内存的操作,会大大降低运行效率,并造成大量内存碎片。现在将它们缓存在一个小整型对象池中,能提高Python的整体性能。
下面给两个变量都赋值100,用is比较它们的内存地址。
>>> a=100
>>> b=100
>>> a is b
True
可见,它们的地址是相同的。所以,赋值100给a以后的变量,它们都指向同一个对象,而不是重新分配内存空间。
下面给两个变量都赋值500,用is比较它们的内存地址。
>>> a=500
>>> b=500
>>> a is b
False
因为500超出了[-5,256]的范围,命令行模式下Python不再提供缓存,所以a和b指向两个不同的对象。
注意:在Pycharm或者保存为文件执行时,提供缓存的数字范围更大,为[-5,任意正整数]。