比较int和float时,Python何时执行类型转换?

时间:2018-09-28 14:03:27

标签: python python-3.x floating-point int python-internals

当我比较具有相同值的Trueint对象时,为什么Python返回float

例如:

>>> 5*2 == 5.0*2.0
>>> True

7 个答案:

答案 0 :(得分:2)

  

不同类型的对象(不同的数字类型除外)永远不会比较相等。

并且:

  

Python完全支持混合算术:当二进制算术运算符具有不同数值类型的操作数时,具有“更窄”类型的操作数将扩展为另一个,即整数比浮点数窄,比浮点数窄。 。 混合类型数字之间的比较使用相同的规则。

     

https://docs.python.org/3/library/stdtypes.html#numeric-types-int-float-complex

比较逻辑由每种类型的__eq__ method实现。标准数字类型以相互支持比较(和算术运算)的方式实现。 Python作为一种语言,永远不会进行隐式类型转换(例如Javascript的==运算符会进行隐式类型转换)。

答案 1 :(得分:1)

10 == 10.0转换为对(10).__eq__(10.0)的呼叫(或更正式的说法是int.__eq__(10, 10.0))。 int.__eq__的实现可以处理与其他类型的比较,但是在语言级别没有类型转换。

答案 2 :(得分:1)

简单的答案是,语言是通过这种方式设计的。以下是支持此内容的文档摘录:

6.10.1 Value Comparisons

  

内置数字类型(Numeric Types — int,float,complex)和标准库类型分数(分数和小数)的数量可以在其类型之内和之间进行比较,但不能使用复数支持订单比较。

换句话说,我们希望具有相同值的不同数字类型相等。

PEP 20

  

特殊情况还不足以打破规则。

     

尽管实用性胜过纯度。

除了在大多数情况下使生活变得困难之外,使数字类型不具有可比性还有什么好处?

答案 3 :(得分:1)

您可以查看the source code的CPython实现。

此函数之前有此注释,解释了如何尝试进行转换:

/* Comparison is pretty much a nightmare.  When comparing float to float,
 * we do it as straightforwardly (and long-windedly) as conceivable, so
 * that, e.g., Python x == y delivers the same result as the platform
 * C x == y when x and/or y is a NaN.
 * When mixing float with an integer type, there's no good *uniform* approach.
 * Converting the double to an integer obviously doesn't work, since we
 * may lose info from fractional bits.  Converting the integer to a double
 * also has two failure modes:  (1) an int may trigger overflow (too
 * large to fit in the dynamic range of a C double); (2) even a C long may have
 * more bits than fit in a C double (e.g., on a 64-bit box long may have
 * 63 bits of precision, but a C double probably has only 53), and then
 * we can falsely claim equality when low-order integer bits are lost by
 * coercion to double.  So this part is painful too.
 */

不能保证其他实现遵循相同的逻辑。

答案 4 :(得分:0)

来自documentation

  

Python完全支持混合算术:当使用二进制算术时   运算符具有不同数值类型的操作数,带有   “较窄”类型扩展为其他类型,即普通整数   小于长整数小于浮点   比复杂要窄。混合类型使用次数之间的比较   相同的规则。

由此5 * 2扩大到10.0等于10.0 如果要比较混合数据类型,则将基于具有较长范围的数据类型的基础来考虑结果,因此在您的情况下,浮点范围大于int 浮动最大数量可以是-> 1.7976931348623157e + 308 int最大数可以是-> 9223372036854775807

谢谢

答案 5 :(得分:-2)

==运算符仅比较值,而不比较类型。您可以使用'is'关键字来达到与其他语言中使用===相同的效果。例如

5 is 5.0

返回     错误

答案 6 :(得分:-4)

== 

是比较运算符

您实际上是在询问解释器,您的表达式的两边是否相等。

换句话说,您要它返回布尔值,而不是转换数据类型。如果要转换数据类型,则必须在代码中进行隐式转换。