我可能会遗漏一些基本的东西,但请考虑这个解释器会话 1 :
>>> -0.0 is 0.0
False
>>> 0.0 is 0.0
True
>>> -0.0 # The sign is even retained in the output. Why?
-0.0
>>>
你会认为Python解释器会意识到-0.0
和0.0
是相同的数字。事实上,它将它们视为相等:
>>> -0.0 == 0.0
True
>>>
那么为什么Python会区分这两者并为-0.0
生成一个全新的对象?它没有用整数做到这一点:
>>> -0 is 0
True
>>> -0 # Sign is not retained
0
>>>
现在,我意识到浮点数是计算机问题的一个重要原因,但这些问题总是与它们的准确性有关。例如:
>>> 1.3 + 0.1
1.4000000000000001
>>>
但这不是一个准确性问题,是吗?我的意思是,我们在这里谈的是数字的符号,而不是小数位。
1 我可以在Python 2.7和Python 3.4中重现这种行为,因此这不是版本特定的问题。
答案 0 :(得分:12)
在IEEE754中,浮点数的格式,符号是一个单独的位。所以-0.0和0.0因此而不同。
整数使用二进制补码表示负数;这就是为什么只有一个0
。
仅使用is
您真正想要比较对象的实例。否则,尤其是对于数字,请使用==
:
>>> 1999+1 is 2000
False
>>> 0.0 == -0.0
True
答案 1 :(得分:8)
IEEE浮点运算标准(IEEE 754)定义了signed zeroes的包含。理论上,它们允许您区分负数下溢和正数underflow。
就python而言,使用==
而不是is
来比较数字。
答案 2 :(得分:4)
因为这两个数字的二进制表示不同。在0.0中,第32位为0,在-0.0中,第32位为1.