如何解决python中小数精确问题以及原因
- 原因:因为 Python 中使用双精度浮点数来存储小数。在 Python 使用的 IEEE 754 标准(52M/11E/1S)中,8字节64位存储空间分配了52位来存储浮点数的有效数字,11位存储指数,1位存储正负号,即这是一种二进制版的科学计数法格式。虽然52位有效数字看起来很多,但麻烦之处在于,二进制小数在表示有理数时极易遇到无限循环的问题。其中很多在十进制小数中是有限的,比如十进制的 1/10,在十进制中可以简单写为 0.1 ,但在二进制中,他得写成:0.0001100110011001100110011001100110011001100110011001……(后面全是 1001 循环)。因为浮点数只有52位有效数字,从第53位开始,就舍入了。这样就造成了标题里提到的”浮点数精度损失“问题。
- 解决方法:
-1. round内置函数: round()如果只有一个数作为参数,不指定位数的时候,返回的是一个整数,而且是最靠近的整数(这点上类似四舍五入)。但是当出现.5的时候,两边的距离都一样,round()取靠近的偶数。 - 2.使用格式化:>>> a = ("%.2f" % 2.635)
>>>a
2.63
列表生成式 - 1:首先是使用range模块。
a=[]
for i in range(1,9):
a.append(i)
print(a)
结果:[1, 2, 3, 4, 5, 6, 7, 8] - List item
- 2:第二种
print([x for x in range(1,10)])
结果:[1, 2, 3, 4, 5, 6, 7, 8, 9]
匿名函数,高阶函数,装饰器
- 1:匿名函数:匿名函数指一类无须定义标识符的函数或子程序。Python用lambda语法定义匿名函数,只需用表达式而无需申明。
例如:lambda [arg1 [,arg2, … argN]] : expression
具体为:>>> print((lambda x,y:x-y)(3,4))
>>>-1
可以直接调用。
高阶函数 - 概念:一个函数可以接收另一个函数作为参数,这种函数就称之为高阶函数。
装饰器
就是在不改变原本代码的基础上对其进行改变,@函数名。
类的继承及self的理解
class A ():
def __init__(self,name):
self.name=name
class B( A ):
def __init__(self):
super(B,self).__init__(name='xiaoming')
c=B()
print(c.name)