Py学习  »  Python

在python列表中查找浮点

Kamlesh Dev • 5 年前 • 453 次点击  

这个问题已经有了答案:

我很惊讶看到这种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
 
453 次点击  
文章 [ 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的数字。