Python 为什么是5!=5.0000000000001为假,但为5!=5.00000001对吗?

Python 为什么是5!=5.0000000000001为假,但为5!=5.00000001对吗?,python,python-3.x,floating-point,precision,comparison-operators,Python,Python 3.x,Floating Point,Precision,Comparison Operators,在Python3.5中,我只是在玩比较运算符,遇到了这个(看起来)奇怪的地方 在小数点过去后,是否存在一个零个数的阈值,解释者由于浮点值的内在不精确而决定不考虑相关的值?Python需要将输入转换为C double,然后可以将其转换为Pythonfloat。更多的输入将得到近似值,5.000000000000000 1将得到近似值5.0: >>> 5.0000000000000001 5.0 因此,比较5==5.0000000000000001将成功(5将被转换为等于5.0

在Python3.5中,我只是在玩比较运算符,遇到了这个(看起来)奇怪的地方


在小数点过去后,是否存在一个零个数的阈值,解释者由于浮点值的内在不精确而决定不考虑相关的值?Python需要将输入转换为

C double
,然后可以将其转换为Python
float
。更多的输入将得到近似值,
5.000000000000000 1
将得到近似值
5.0

>>> 5.0000000000000001 
5.0
因此,比较
5==5.0000000000000001
将成功(
5
将被转换为等于
5.0
的Python浮点值,以便进行比较)

对于小于上述数字的数字,结果(可以表示)本身就说明了这一点:

>>> 5.000000000000001
5.000000000000001

是的,
float\u richcompare
不幸地与这种行为无关,正如我在最初对这个问题的评论中所想的那样。这一切都发生在它被调用之前

@BilltheLizard,我认为问题是不同的,因为上下文是比较运算符,尽管它显然是相关的。在本例中,我要问的是为什么python不能计算出5.0000000000001不是5,而不是为什么python在计算FPV时返回近似值。不确定是否值得立即投反对票…(不是说是你,但不管是谁,得到解释都很好。)@jeremyradcliff好吧,它们不是字符串,所以显然有(隐含的)解析步骤。因为它们变成了真正的浮点数,所以它们的精度受到限制。@harold,谢谢你,这是有道理的。如果你愿意的话,看看他对这次操作负责。我通常认为这是一个很好的问题。@JimFasarakis Hilliard,谢谢。这可能超出了我目前的能力去掌握这个函数的所有内容,但是我认为我可以通过慢慢地进行并尝试来获得很多;我不知道python正在经历将输入转换成C双精度的过程。为什么是“不幸的”?你肯定不希望浮点数的相等比较做某种模糊比较:它会弄乱相等的传递性,从而导致set和dict包含,等等。@MarkDickinson我最初认为这是一个
float\u richcompare
做的事情,也就是说我错过了
float\u new
;“50000000000000000001”将接近
5.0
;。我想那是在
richcompare
中发生的。“不幸的是”指向我在问题下的“swing and miss”评论:-)好吧,没有任何超过16位的输入:例如,5.0000000000000005不是5。@RickRegan措辞含糊不清,更新了它以更好地描述我的意思。