Python';s进行丰富比较的行为(或者,当十进制(';100.0';)<;01时)

Python';s进行丰富比较的行为(或者,当十进制(';100.0';)<;01时),python,floating-point,compare,decimal,Python,Floating Point,Compare,Decimal,所以我有一句话: import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01)) 编辑:关于排序的文档:我有Python 2.6.4,您的示例运行良好,即我发现 (True, False, NotImplemented, NotImplemented) 这是意料之中的。我不知道你为什么会得到不同的结果 关于id:id与比较无关,因此在任何情况下都不应通过i

所以我有一句话:

import decimal; h = decimal.Decimal('100.0'); (h > .01, h < .01, h.__gt__(.01), h.__lt__(.01))

编辑:关于排序的文档:

我有Python 2.6.4,您的示例运行良好,即我发现

(True, False, NotImplemented, NotImplemented)
这是意料之中的。我不知道你为什么会得到不同的结果

关于
id
id与比较无关,因此在任何情况下都不应通过
id(a)
来比较
a
b
,这是毫无意义的
id
有点像内存中的地址,所以比较它们毫无意义

当富比较方法返回时 没有实现,会发生什么?为什么? 这不引起一个例外吗

它在比较(float
)中委托给逆向方法(例如,当操作符是
>
)RHS(在本例中,它还返回NotImplemented),并最终回到Python 2用于异构比较的愚蠢的旧规则

当它没有得到实施时,为什么会这样呢 在第一种情况下返回False,并且 第二个是真的吗? bool(未实现)应该是 不变的

不涉及bool——由于比较的双方都返回NotImplemented(由于故意设计决定不支持小数和浮点数之间的任何操作),因此愚蠢的旧规则被用作备用规则(在最近的版本中将比较类型,而不是实例--
id
与此无关)。在Python3中,这样一个不受支持的异构比较将失败,并引发一个明显的异常,但在Python2中,为了向后兼容,这是不可能发生的——它必须在Python2的整个生命周期中保持愚蠢的行为


引入向后不兼容来修复现在被认为是设计错误的东西,比如关于het比较的这一部分,是引入Python3的核心原因。只要你坚持使用Python2(例如,因为它有更多的第三方扩展,等等),您需要微笑并忍受这些仅在Python 3中修复的缺陷。

id()是在对象未定义其自身比较的情况下对对象进行排序的最后手段。我不记得确切的使用时间,但它确实是。您是对的,它没有意义,除非您试图保证这一点“对象的排序是一致的,但却是任意的(这样对异构数组进行排序会产生一致的结果)”,正如文档所指出的,python就是这样做的。它恰好适合您:尝试999.01而不是0.1,您将看到完全相同的结果,这表明它“工作不正常”(这是一个停止的时钟:每天纠正两次;-)。这些类型最终会被比较(并且这些类型比较在不同的Python安装中不需要以相同的方式工作),而不是人们通常期望的值。@CB,
id
被用作非顺序比较(相等和不相等)的最后手段还有散列,它非常有意义;它从来没有用于排序比较,比如
,我明白了。非常有趣的讨论。我几乎错过了问题的要点,对不起。+1对你们两个来说!啊,我不知道类型对象上的交叉类型排序。谢谢你的明确解释。好吧,经过多次的绞尽脑汁和b在Python2.7中,规则已经放宽了一点:十进制和浮点实例现在可以进行合理的比较。主要的技术问题是保留比较相等的数字也应该散列相等的规则。(不过,不要尝试比较十进制和小数实例!)
from decimal import Decimal
h = Decimal('100.0')
f = .01
print h < f, id(h) < id(f)
print h > f, id(h) > id(f)
Python 2.6.4 (r264:75708, Oct 26 2009, 08:23:19) [MSC v.1500 32 bit (Intel)] on win32
Python 2.6.5 (r265:79096, Mar 19 2010, 21:48:26) [MSC v.1500 32 bit (Intel)] on win32
(True, False, NotImplemented, NotImplemented)