Python基础数据类型之数字类型
Python 2.x的整数类型区分int和long。
Python 3.x不再区分int和long,统一使用int。
数字类型分为:
int整数类型float浮点型complex复数类型
int整数类型在32位机器上,整数的位数为32位,取值范围为
-2**31~2**31-1,即-2147483648~2147483647在64位系统上,整数的位数为64位,取值范围为
-2**63~2**63-1,即-9223372036854775808~9223372036854775807
Python 2.x的数字类型区分int整型和long长整型
1 | # Python 2.7 |
float浮点型浮点数,带小数点的数,精度与机器有关。
浮点数示例:
1 | f = 12.12 |
浮点数精度问题
为什么所有支持浮点数运算的编程语言会遇到浮点数精度问题?
真正原因在于十进制数与二进制数转换的时候导致的。
计算机其实不认识十进制数,它只认识二进制数,当以十进制数进行运算时,计算机需要将使十进制数转换成二进制数,然后进行二进制间的计算。
+ 十进制小数转换成二进制数
+ 0.1转换成二进制数示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
0.1*2=0.2 --> 取出整数部分0
0.2*2=0.4 --> 取出整数部分0
0.4*2=0.8 --> 取出整数部分0
0.8*2=1.6 --> 取出整数部分1
0.6*2=1.2 --> 取出整数部分1
0.2*2=0.4 --> 取出整数部分0
0.4*2=0.8 --> 取出整数部分0
0.8*2=1.6 --> 取出整数部分1
0.6*2=1.2 --> 取出整数部分1
# 接下来会无限循环
0.2*2=0.4 --> 取出整数部分0
0.4*2=0.8 --> 取出整数部分0
0.8*2=1.6 --> 取出整数部分1
0.6*2=1.2 --> 取出整数部分1
+ 转换成二进制数的结果
1
0.00011 0011...0011...0011...
0.1转换成二进制数的结果是无限循环,0.1转换成二进制数后,无法精确到等于十进制数的0.1。由于计算机的存储位数有限制,所以需要存储的二进制位数超过计算机存储位数的最大值,后续的位数会被舍弃,舍弃的原则是“0舍1入”。
+ **十进制小数转换成二进制小数的计算方法:**用“乘2取整,顺序排列”法。
用2乘十进制小数,可以得到积,将积的整数部分取出,再用2乘余下的小数部分,又得到一个积,再将积的整数部分取出,以此类推,直到积中的小数部分为零,此时0或1为二进制的最后一位。或者达到所要求的精度为止。然后把取出的整数部分按顺序排列起来,先取的整数作为二进制小数的高位有效位,后取的整数作为低位有效位。
+ 0.3转换成二进制数示例:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
0.3*2=0.6 --> 取出整数部分0
0.6*2=1.2 --> 取出整数部分1
0.2*2=0.4 --> 取出整数部分0
0.4*2=0.8 --> 取出整数部分0
0.8*2=1.6 --> 取出整数部分1
# 接下来会无限循环
0.6*2=1.2 --> 取出整数部分1
0.2*2=0.4 --> 取出整数部分0
0.4*2=0.8 --> 取出整数部分0
0.8*2=1.6 --> 取出整数部分1
+ 转换成二进制数的结果
1
0.01001...1001...1001...
1
2
3
4
5
6
7
8
9
10
11
12
13
14
f1 = 0.1
f2 = 0.2
print(f1+f2)
# 0.30000000000000004
f2 = 11.11
f3 = 12.12
print(f2+f3)
# 23.229999999999997
f4 = 10
f5 = 3
print(f4/f5)
# 3.3333333333333335
提供高浮点数精度
使用decimal模块,得到更精确的结果。
decimal模块实现的十进制数运算适合会计方面的应用和有高精度要求的应用。
使用fractions模块的Fraction函数
如果decimal模块还是满足不了精度的要求,可以使用fractions模块。
1. 使用decimal模块
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
import decimal
f1 = decimal.Decimal("0.1")
f2 = decimal.Decimal("0.2")
print(f1+f2)
# 0.3
f1 = decimal.Decimal("11.11")
f2 = decimal.Decimal("12.12")
print(f1+f2)
# 23.23
f3 = decimal.Decimal("10.0")
f4 = decimal.Decimal("3")
print(f3/f4)
# 3.333333333333333333333333333
2. 使用fractions模块的Fraction函数
1
2
3
from fractions import Fraction
print(Fraction(10,3))
# 10/3
complex复数类型
未完待续 ……
本文链接: https://blog.xmysql.com/20200603/Python%E5%9F%BA%E7%A1%80%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B%E4%B9%8B%E6%95%B0%E5%AD%97%E7%B1%BB%E5%9E%8B.html
版权声明: 本作品采用 知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议 进行许可。转载请注明出处!