我很惊讶地看到这种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
>>
答案 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()
,并使用atol
或rtol
参数-docs here