python数字类型与浮点数精度
目录
python数字类型与浮点数精度
python数字类型
1.整数
和C、C++不一样,python的整数长度是不受限制的,所以可以直接进行特别大的数字运算
值得注意的是python中整数相除得到的结果是浮点数,也就是说python中的 / 不是整除,在使用时应该注意
如果我们需要实现整除,那里可以采用"//“来实现
例子:
>>> 159956556548/1525456187
104.85817810511787
>>> 8/4
2.0
#整除
>>> 8//4
2
2.浮点数
python中的浮点数是采用IEEE754标准存储的,在我们运算的时候可能会出现一些小问题
>>> 0.1+0.2
0.30000000000000004
>>> 0.3+0.4
0.7
>>> 0.2+0.2
0.4
>>> 0.2+0.7#计算错误
0.8999999999999999
>>> 0.2+0.7==0.9#比较出现错误
False
所以在对浮点数进行相关的比较操作时一定要注意,一般不建议直接对两个浮点数进行比较,可能会像上面一样出现错误
3.如何精确的表示浮点数
我们可以利用python的decimal模块来实现
1)通过字符串构建一个Decimal对象
>>> import decimal
>>> a=decimal.Decimal('0.1')
>>> b=decimal.Decimal('0.2')
>>> print(a+b)
0.3#计算结果正确
>>> c=decimal.Decimal('0.3')
>>> a+b==c
True#比较结果正确
2)使用小数的通常开始是导入模块,使用getcontext()和查看当前上下文,并在必要时设置精度,舍入或启用陷阱的新值。
十进制实例可以由整数,字符串,浮点数或元组构造。从整数或浮点数进行构造会对该整数或浮点数的值进行精确转换。十进制数包括特殊值,例如 NaN代表“非数字”,正数和负数 Infinity,以及-0:
>>> from decimal import *
>>> getcontext()
Context(prec=28, rounding=ROUND_HALF_EVEN, Emin=-999999, Emax=999999, capitals=1, clamp=0, flags=[], traps=[InvalidOperation, DivisionByZero, Overflow])
>>> getcontext().prec = 7 # Set a new precision
>>> Decimal(1)/Decimal(7)
Decimal('0.1428571')#7位有效数字
decimal其他的一些例子
>>> getcontext().prec = 28
>>> Decimal(10)
Decimal('10')
>>> Decimal('3.14')
Decimal('3.14')
>>> Decimal(3.14)
Decimal('3.140000000000000124344978758017532527446746826171875')
>>> Decimal((0, (3, 1, 4), -2))
Decimal('3.14')
>>> Decimal(str(2.0 ** 0.5))
Decimal('1.4142135623730951')
>>> Decimal(2) ** Decimal('0.5')
Decimal('1.414213562373095048801688724')
>>> Decimal('NaN')
Decimal('NaN')
>>> Decimal('-Infinity')
Decimal('-Infinity')
3.科学计数法
python中采用E表示法,也就是科学技术法
如:
>>> 0.0000009
9e-07