当前位置: 首页 > 知识库问答 >
问题:

Python在比较int和浮点数时何时执行类型转换?

葛昱
2023-03-14

当我比较具有相同值的< code>int和< code>float对象时,为什么Python返回< code>True?

例如:

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

共有3个答案

段干跃
2023-03-14

简单的答案是,语言就是这样设计的。以下是支持这一观点的文档摘录:

6.10.1 值比较

内置数字类型(数字类型-int、float、complex)和标准库类型分数的数量。分数和小数。小数可以在其类型内和类型间进行比较,但有一个限制,即复数不支持顺序比较。

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

PEP 20

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

虽然实用性战胜了纯粹性。

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

盛嘉
2023-03-14

不同类型的对象,除了不同的数字类型,永远不会比较相等。

和:

Python完全支持混合算术:当一个二进制算术运算符有不同数值类型的操作数时,“较窄”类型的操作数会加宽到另一个,其中整数比浮点窄,浮点比复数窄。混合类型的数字之间的比较使用相同的规则。

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

比较逻辑由每个类型的__eq_方法实现。标准数字类型的实现方式是支持彼此之间的比较(和算术运算)。Python作为一种语言从不进行隐式类型转换(就像Javascript的=操作符会进行隐式的类型转换)。

邰昀
2023-03-14

它不像类型转换那么简单。

10==10.0委托给参数的__eq__方法,首先尝试 >,然后尝试 (10.0__eq__(10),如果第一次调用返回 NotImplementated。它不会尝试转换类型。(从技术上讲,方法查找使用了一个特殊的例程,该例程绕过实例 __dict_条目和 __getattribute_/ 重写,因此它并不等同于自己调用方法。)

< code>int。__eq__不知道如何处理浮点:

>>> (10).__eq__(10.0)
NotImplemented

但是float.__eq__知道如何处理整数:

>>> (10.0).__eq__(10)
True

float.__eq__也不仅仅是在内部进行演员阵容。它有超过 100 行代码来处理浮点/整数比较,而不会引入未经检查的转换可能引入的舍入误差。(如果 C 级比较例程不必处理,其中一些可以简化

 类似资料:
  • 对于这些代码行,我得到0作为输出,即它们都是相等的。现在,如果我理解正确,a b和c可能会存储稍微不同版本的真值.3因此,当做一个Float.compare(...)对这些值,我希望得到一个输出值,而不是0。为什么我把它们取为0?

  • 问题内容: 我刚刚阅读了有关浮点值比较的声明 不得使用==或!=运算符比较浮点值。大多数浮点值没有精确的二进制表示形式,并且精度有限。 如果是这样,比较两个浮点值的最佳方法是什么? 问题答案: 以下扩展方法对于实现Kevin的建议可能有用: 现在,您可以执行以下操作: 只需将更改为更合适的名称,或在需要时将默认边距更改为比更好的值。

  • 问题内容: 我对SQL相当陌生,我试图获取与productID用户输入匹配的产品的完整列表。就像是: 我希望列出所有匹配的产品,例如:15、150、2154等 不幸的是,由于productID字段是INT而不是字符串,因此我遇到了问题。是否有一些相对简单的方法可以解决此问题? 问题答案: 您可以将字段输入字符串: 这对性能非常不利,因为mySQL无法利用它为INT列创建的任何索引。但是,即使在va

  • 为什么在比较Jython中相同值的Java整数和Python整数时会出现以下行为? 好吧,我觉得这两个

  • 问题内容: 我想比较PHP中的两个浮点数,如以下示例代码所示: 在此代码中,即使和相同,它也返回条件的结果而不是条件。有没有什么特殊的方法来处理/比较PHP中的浮点数? 如果是,那么请帮助我解决此问题。 还是我的服务器配置有问题? 问题答案: 如果您这样做,它们 应该 是相同的。但是请注意,浮点值的一个特征是 看起来 可以导致相同值的计算实际上不必相同。因此,如果是一个文字并通过计算到达该文字,则

  • 问题内容: 我正在寻找比较应该相同的两个数据框。但是,由于浮点精度,我被告知值不匹配。我在下面创建了一个示例进行模拟。如何获得正确的结果,以便最终比较数据帧对两个单元格都返回true? 问题答案: 好的,您可以为此使用: 需要相对公差和绝对公差。这些有默认值:,分别