社区所有版块导航
Python
python开源   Django   Python   DjangoApp   pycharm  
DATA
docker   Elasticsearch  
aigc
aigc   chatgpt  
WEB开发
linux   MongoDB   Redis   DATABASE   NGINX   其他Web框架   web工具   zookeeper   tornado   NoSql   Bootstrap   js   peewee   Git   bottle   IE   MQ   Jquery  
机器学习
机器学习算法  
Python88.com
反馈   公告   社区推广  
产品
短视频  
印度
印度  
Py学习  »  Python

在python列表中查找浮点

Kamlesh Dev • 5 年前 • 466 次点击  

这个问题已经有了答案:

我很惊讶看到这种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
>>
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/49442
 
466 次点击  
文章 [ 2 ]  |  最新文章 5 年前
Dagorodir
Reply   •   1 楼
Dagorodir    6 年前

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

你可以试着用 numpy.allclose() ,设置与 atol rtol 参数-文档 here

Mehdi
Reply   •   2 楼
Mehdi    6 年前

根据 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的系统中是干净的小数 在计算机正在运行的BASE2系统中重复小数。 当你在这些重复的小数上做数学运算时 当你转换计算机的基础2时遗留下来的剩菜 (二进制)一个人类可读性更强的基数10的数字。