在python列表中查找浮点数

时间:2019-06-01 21:51:22

标签: python

我很惊讶地看到这种python行为,但是不明白为什么?我无法在python列表中搜索0.3。

>> import numpy as np
>> Lambdas = np.arange(0.0, 1.05, 0.05)
>> print(Lambdas)
[0.   0.05 0.1  0.15 0.2  0.25 0.3  0.35 0.4  0.45 0.5  0.55 0.6  0.65
 0.7  0.75 0.8  0.85 0.9  0.95 1.  ]
>> print(0.3 in Lambdas)
False
>> print(0.30 in Lambdas)
False
>> print(0.1 in Lambdas)
True
>> print(0.4 in Lambdas)
True
>> print(1 in Lambdas)
True
>> print(1.0 in Lambdas)
True
>> print(0.1 in Lambdas)
True
>>

2 个答案:

答案 0 :(得分:2)

根据http://0.30000000000000004.com/

  

您的语言没有中断,它正在进行浮点运算。计算机只能本地存储整数,因此需要某种方式   代表十进制数字。这种表示带有一些   不准确度。因此,通常是.1 + .2!= .3。

     

为什么会这样?实际上很简单。当你有一个   以10为基数的系统(如我们的系统),它只能表示使用   基数的素数。 10的素数是2和5。所以1/2   1 / 4、1 / 5、1 / 8和1/10都可以清晰表达,因为   分母均使用10的质因子。相反,1 / 3、1 / 6和   1/7都是重复的小数,因为它们的分母使用质数   因子3或7。在二进制(或基数2)中,唯一质数是2。   因此,您只能清晰地表达只包含2作为   主要方面。以二进制形式将1 / 2、1 / 4、1 / 8都清楚地表达出来   作为小数。而1/​​5或1/10将重复小数。所以0.1   和0.2(1/10和1/5),而以10为基数的系统中的纯净小数是   在计算机运行的以2为基础的系统中重复小数。   当您对这些重复的小数进行数学运算时,最终得到   转换计算机底座2时结转的剩菜   (二进制)数字转换成更容易理解的10号数字。

答案 1 :(得分:1)

根据Mehdi的综合回答和ruohola的评论,存储在数组中的浮点值可能不完全是0.3

您可以尝试使用numpy.allclose(),并使用atolrtol参数-docs here

设置最小差异的容差