表示数字或数值的数据类型称为数字类型。
Python语言提供3种数字类型:整数、浮点数、复数,分别对应数学中的整数、实数和复数。
整数类型与数学中整数的概念一致,下面是整数类型的例子:
1010,99,-123,0x9a,-0x89
整数类型共有4种进制表示:十进制、二进制、八进制和十六进制。默认情况,整数采用十进制,其他进制需要增加引导符号。
二进制数以 0b 引导,八进制数以 0o 引导,十六进制数以 0x 引导,字母大小写均可使用
进制种类 | 描述 |
---|---|
十进制 | 默认情况,例如,1010,-123 |
二进制 | 由字符 0 和 1 组成,例如,0b101,0B101 |
八进制 | 由字符 0 到 7 组成,例如,0o456,0O456 |
十六进制 | 由字符 0 到 9 、a 到 f、A 到 F 组成,例如,0xABC,0XABC |
整数类型理论上的取值范围是[-∞,∞],实际上的取值范围受限于运行 Python 程序的计算机内存大小。
pow(x,y) 函数是 Python 语言的一个内置函数,用来计算 xy 。我们可以用 pow() 函数来测试一下整数类型的取值范围,例如:
print(pow(2,100))
结果为 1267650600228229401496703205376
print(pow(2,500))
结果为3273390607896141870013189696827599152216642046043064789483291368096133796404674554883270092325904157150886684127560071009217256545885393053328527589376
除极大数的运算外,一般认为整数类型没有取值范围限制。
pow() 函数还可以嵌套使用,例如:
print(pow(2,pow(2,15)))
上述程序的结果是一个 9865 位的整数
浮点数类型与数学中实数的概念一致,表示带有小数的数值。Python 语言要求所有浮点数必须带有小数部分,小数部分可以是 0,这种设计可以区分浮点数和整数类型。
浮点数有两种表示方法:十进制表示和科学计数法表示
下面是浮点数的例子:
0.0,-55.,-2.13,3.1416,96e4,4.3e-3,9.6E5
科学计数法使用字母 e 或 E 作为幂的符号
以 10 为基数,含义如下:
<系数>e<基数>
4.3e-3 值为 0.0043 ; 9.6E5 也可以表示为 9.6E+5 ,其值为 960 000.0。
浮点数类型与整数类型由计算机的不同硬件单元执行,处理方法不同,需要注意的是,尽管浮点数 0.0 与整数 0 值相同,但它们在计算机内部表示不同。
Python 浮点数的数值范围和小数精度受不同计算机系统的限制,sys.float_info 详细列出了 Python 解释器所运行系统的浮点数各项参数。
import sys
print(sys.float_info)
sys.float_info(max=1.7976931348623157e+308, max_exp=1024, max_10_exp=308,
min=2.2250738585072014e-308, min_exp=-1021, min_10_exp=-307, dig=15, mant_dig=53,
epsilon=2.220446049250313e-16, radix=2, rounds=1)
print(sys.float_info.max)
1.7976931348623157e+308
上述输出给出浮点数类型所能表示的最大值(max)、最小值(min)、科学计数法表示下最大值的幂(max_10_exp)、最小值的幂(min_10_exp)、基数(radix)为 2 时最大值i的幂(max_exp)、最小值的幂(min_exp),科学计数法表示中系数的最大精度(mant_dig),计算机所能分辨的两个相邻浮点数的最小差值(epsilon),能准确计算的浮点数最大个数(dig)。
浮点数类型直接表示或科学计数法表示中的系数最长可输出 16 个数字,浮点数运算结果中最长可输出 17 个数字,然而,根据 sys.float_info 结果,计算机只能够提供 15个数字(dig) 的准确性,最后一位由计算机根据二进制计算结果确定,存在误差,例如:
print(3.1415926535897924)
3.1415926535897922
print(987654321123456.789)
987654321123456.8
浮点数在超过 15 位数字计算中产生的误差与计算机内部采用二级制运算有关,因此使用浮点数无法进行极高精度的数学运算。
由于Python 语言能够支持无限制且准确的整数计算,因此,如果希望获得精度更高的计算结果,往往采用整数而不直接采用浮点数。例如,计算如下两个数的乘法值,它们的长度只有 10 个数字,其中:a = 3.141592653, b = 1.234567898
可以直接采用浮点数运算,也可以同时把它们的小数点去掉,当作整数运算,结果如下:
print(3.141592653*1.234567898)
3.8785094379864535
print(3141592653*1234567898)
3878509437986453394
其中,浮点数运算输出 17 个数字长度的结果,然而,只有前 15 个数字是确定正确的。而整数运算能够输出完全准确的运算结果。使用整数表达浮点数的方法是高精度运算的基本方法之一。
Python 通过标准库 decimal 提供了一个更准确的数字类型 Decimal ,这个类型利用上文所 介绍的整数运算方法提供高精度浮点数运算,并可以使用 getcontext().prec 参数自定义浮点数精度的位数,例如:
import decimal
a=decimal.Decimal('3.141592653')
b=decimal.Decimal('1.234567898')
decimal.getcontext().prec=20
print(a*b)
3.878509437986453394
需要注意的是,在使用 decimal 库时,Decimal(‘数字’)是高精确度数字的基本表示形式,需要使用单引号,例如,decimal.Decimal(‘3.141592653’)。
复数类型表示数学中的复数。它可以看作二元有序实数对(a,b),表示为 a + bj ,不同于我们数学中用 a + bi 来表示, 其中,a 是实数部分,简称实部,b 是虚数部分,简称虚部。事实上,复数是实数在二维平面空间旋转的一种表示。
Python 语言中,复数的虚数部分通过后缀 ”J“ 或 “j” 来表示,例如:
12.3+4j -5.6+7j 1.23e-4+5.67e+89j
复数类型中实数部分和虚数部分的数值都是浮点类型。对于复数 z,可以用 z.real 和 z.imag 分别获得它的实数部分和虚数部分,例如:
print((1.23e-4 + 5.67e+89j).real)
0.000123
print((1.23e-4 + 5.67e+89j).imag)
5.67e+89
这次的分享就到这里啦