为什么 print(2 == 2.) returns 在 Python 中为真
why print(2 == 2.) returns True in Python
为什么print(2 == 2.)
returnsTrue
据我了解,2
是整数,2.0
是浮点数。它们在内存中的存储方式不同。
我认为它正在返回 True
因为它们都属于同一个 class 即 integer class
?
我遇到过类似的堆栈溢出问题,但我仍然不清楚概念。有人可以解释一下吗?
这取决于python如何实现float和int之间的相等运算符。我想在这种情况下,在执行引擎盖下的比较之前,将 int 强制转换为 float。
内存表示实际上与它没有任何关系(或者至少,它不会阻止某些整数与等效实数进行比较)。
2 == 2.
由 int.__eq__(2, 2.)
实现,它被定义为通过进行适当的类型转换来处理 integer/float 比较。由于 int
是比 float
更“窄”的类型,因此 2
首先转换为浮点值。 (作为一个实现细节,我怀疑这是通过 int.__eq__
调用 float.__eq__(2., 2)
完成的,并且转换在那里完成,而不是 int
类型知道关于浮点值如何转换的任何特定细节表示。)
请注意,并非 每个 int
都可以精确表示为浮点值,因为 int
使用任意精度,但 float
是固定的。例如,在我的机器上
>>> 2000000000000000000000000000000000 == 2000000000000000000000000000000000.
False
(我复制粘贴了整数以生成浮点文字,因此 0 排成一行。)
为什么print(2 == 2.)
returnsTrue
据我了解,2
是整数,2.0
是浮点数。它们在内存中的存储方式不同。
我认为它正在返回 True
因为它们都属于同一个 class 即 integer class
?
我遇到过类似的堆栈溢出问题,但我仍然不清楚概念。有人可以解释一下吗?
这取决于python如何实现float和int之间的相等运算符。我想在这种情况下,在执行引擎盖下的比较之前,将 int 强制转换为 float。
内存表示实际上与它没有任何关系(或者至少,它不会阻止某些整数与等效实数进行比较)。
2 == 2.
由 int.__eq__(2, 2.)
实现,它被定义为通过进行适当的类型转换来处理 integer/float 比较。由于 int
是比 float
更“窄”的类型,因此 2
首先转换为浮点值。 (作为一个实现细节,我怀疑这是通过 int.__eq__
调用 float.__eq__(2., 2)
完成的,并且转换在那里完成,而不是 int
类型知道关于浮点值如何转换的任何特定细节表示。)
请注意,并非 每个 int
都可以精确表示为浮点值,因为 int
使用任意精度,但 float
是固定的。例如,在我的机器上
>>> 2000000000000000000000000000000000 == 2000000000000000000000000000000000.
False
(我复制粘贴了整数以生成浮点文字,因此 0 排成一行。)