在python列表中查找浮点
看到这种python行为我很惊讶,但不明白为什么?我无法在python列表中搜索0.3在python列表中查找浮点,python,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. ]
>> 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
>>
根据Mehdi的综合回答和ruohola的评论,数组中存储的浮点值可能不完全是0.3 您可以尝试使用
numpy.allclose()
,根据
你的语言没有被破坏,它在做浮点运算。计算机只能在本机上存储整数,因此它们需要某种方式来存储整数
表示十进制数的。这种表示法有一些缺点
不准确的程度。这就是为什么,通常情况下,.1+.2!=。三,
为什么会发生这种情况?其实很简单。当你有一个
以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将是重复的小数。So 0.1
和0.2(1/10和1/5),而在基数为10的系统中,是干净的小数
在计算机运行的基数为2的系统中重复小数。
当你对这些重复的小数进行数学运算时,你会得到
转换计算机底座时遗留下来的残留物2
(二进制)数字转换为更易于阅读的10进制数字
因为
Lambdas
中的值不完全是0.3
,而是类似于0.3000000000004
,这就是浮点数的工作方式。是的,明白了。谢谢