我想生成一组小数,大小为从0到1,间隔为0.2,即:[0, 0.2, 0.4, 0.6, 0.8, 1]
1. while循环生成
a_list = []
i = 0
while i <= 1:
a_list.append(i)
i += 0.2
print(a_list)
打印结果为:
[0, 0.2, 0.4, 0.6000000000000001, 0.8, 1.0]
奇怪,为什么会有0.600000000000001这样子的结果呢?
如果我间隔设置为0.1,即我想要得到这样的list:[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1]
a_list = []
i = 0
while i <= 1:
a_list.append(i)
i += 0.1
print(a_list)
打印结果为:
[0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6, 0.7, 0.7999999999999999, 0.8999999999999999, 0.9999999999999999]
2.利用numpy包
import numpy as np
a = np.arange(0, 1, 0.2)
print(a)
打印结果为:
[0. 0.2 0.4 0.6 0.8]
# 解释: 由于结果是array,0后面跟了一个点。每个数值用空格隔开。
将array转成list
print(a.tolist())
打印结果:
[0.0, 0.2, 0.4, 0.6000000000000001, 0.8]
和while循环生成的结果还是一样。
再用0.1的间隔试一下:
b = np.arange(0, 1, 0.1)
print b.tolist()
打印结果:
[0.0, 0.1, 0.2, 0.30000000000000004, 0.4, 0.5, 0.6000000000000001, 0.7000000000000001, 0.8, 0.9]
居然跟while循环生成的还不一样了。
不知道该怎么解释了?
浮点数的一个普遍问题是它们并不能精确的表示十进制数。 并且,即使是最简单的数学运算也会产生小的误差,比如:
>>> a = 4.2
>>> b = 2.1
>>> a + b
6.300000000000001
>>> (a + b) == 6.3
False
这些错误是由底层CPU和IEEE 754标准通过自己的浮点单位去执行算术时的特征。 由于Python的浮点数据类型使用底层表示存储数据,因此你没办法去避免这样的误差。
解决方法1:
round() 方法返回浮点数x的四舍五入值。第一个参数是一个浮点数,第二个参数是保留的小数位数,可选,如果不写的话默认保留到整数。比如:
>>> round(10.0/3, 2)
3.33
>>> round(20/7)
3
如果不涉及到非常精确的计算:
l = list()
i=0
while i <= 1:
l.append(round(i,1))
i += 0.2
print(l)
[0, 0.2, 0.4, 0.6, 0.8, 1.0]
但是,round函数也有坑: http://www.runoob.com/w3cnote/python-round-func-note.html
解决方法2:
decimal函数,
用在非常精确的小数或浮点数计算上
from decimal import Decimal
l = list()
i = 0
while i <= 1 :
l.append(str(Decimal(i).quantize(Decimal('0.0'))))
i +=0.2
print(l)
打印结果为:
['0.0', '0.2', '0.4', '0.6', '0.8', '1.0']
decimal 其他用法:https://www.cnblogs.com/xueweihan/p/5207959.html